我有一张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条答案
按热度按时间cbeh67ev1#
你可以先用两个值都存在的行计算一个掩码,然后用列
C
的值填充列B
的NA
的值,使用第一步计算的掩码,在需要的地方简单地分配NA
的值。我建议不要给两个值都存在的字符串
error
赋值,因为这会使整个D
列成为object
dtypelh80um4z2#
有几种方法可以实现这一点。
使用
fillna
和mask
或者
numpy.select
:输出:
xesrikrc3#
除了前面的答案之外,您还可以使用一系列
.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')
liwlm1x94#
看一下函数
combine_first
:输出: