我有一张table:
| A|B|C|
| --------------|--------------|--------------|
| x|1|不适用|
| y|不适用|四|
| z|二|不适用|
| p|不适用|五|
| t|六|七|
我想创建一个新的列D,如果其中一列为空(NA),则该列应合并列B和C:
| A|B|C|D|
| --------------|--------------|--------------|--------------|
| x|1|不适用|1|
| y|不适用|四|四|
| z|二|不适用|二|
| p|不适用|五|五|
| t|六|七|误差|
如果两列都包含一个值,则应在单元格内返回文本“error”。
4条答案
按热度按时间qgelzfjb1#
你可以先用两个值都存在的行计算一个掩码,然后用列
C
的值填充列B
的NA
的值,使用第一步计算的掩码,在需要的地方简单地分配NA
的值。我建议不要给两个值都存在的字符串
error
赋值,因为这会使整个D
列成为object
dtypejchrr9hc2#
有几种方法可以实现这一点。
使用
fillna
和mask
或者
numpy.select
:输出:
gkn4icbw3#
除了前面的答案之外,您还可以使用一系列
.apply()
方法和lambda
函数来解决这个问题。考虑您展示的 Dataframe ,其中
np.nan
为NA值:首先从相关系列中生成元素列表:
这将为您生成一个
pd.Series
,其中包含一系列值作为元素,例如第一行为[1.0, nan]
。接下来,使用numpy
中的np.nan != np.nan
删除所有np.nan
元素(另请参见此处的答案:How can I remove Nan from list Python/NumPy)最后,通过基于长度的过滤创建
error
。生成的 Dataframe 如下所示:
当然,你可以把所有这些都串成一个不那么冗长,但只有一行字的答案:
a = df.apply(lambda x: list(x), axis=1).apply(lambda x: [i for i in x if i == i]).apply(lambda x: x[0] if len(x) == 1 else 'error')
6qfn3psc4#
看一下函数
combine_first
:输出: