Python Pandas:创建新列,其中值不为空,基于其他列

6
我有一个类似这样的数据框:
----------------
RecID| A  |B
----------------
1    |NaN | x 
2    |y   | NaN 
3    |z   | NaN
4    |NaN | a 
5    |NaN | b 

我希望创建一个新列C,从A和B中获取数据。如果A为空,就用B填充;如果B为空,则用A填充:

----------------------
RecID|A   |B    |C 
----------------------
1    |NaN | x   |x
2    |y   | NaN |y 
3    |z   | NaN |z
4    |NaN | a   |a
5    |NaN | b   |b

最后,如果我有超过两列的数据,比如我有A-Z列,想要创建一个与上述类似的新列A1,那么是否有更加高效的方法呢?

我刚刚更新了我的答案,包括你所寻找的通用解决方案。你现在已经有超过15个声望值了。请随意给任何你认为有用的答案点赞。 - piRSquared
2个回答

13

pandas
lookup
这是 OP 寻找的通用解决方案,可以在任意数量的列中使用。

lookup = df.loc[:, 'A':'B'].notnull().idxmax(1)
df.assign(A1=df.lookup(lookup.index, lookup.values))

   RecID    A    B A1
0      1  NaN    x  x
1      2    y  NaN  y
2      3    z  NaN  z
3      4  NaN    a  a
4      5  NaN    b  b

fillna

df.assign(C=df.A.fillna(df.B))

   RecID    A    B  C
0      1  NaN    x  x
1      2    y  NaN  y
2      3    z  NaN  z
3      4  NaN    a  a
4      5  NaN    b  b

掩码

df.assign(C=df.A.mask(df.A.isnull(), df.B))

   RecID    A    B  C
0      1  NaN    x  x
1      2    y  NaN  y
2      3    z  NaN  z
3      4  NaN    a  a
4      5  NaN    b  b

combine_first

df.assign(C=df.A.combine_first(df.B))

   RecID    A    B  C
0      1  NaN    x  x
1      2    y  NaN  y
2      3    z  NaN  z
3      4  NaN    a  a
4      5  NaN    b  b
numpy np.where
df.assign(C=np.where(df.A.notnull(), df.A, df.B))

   RecID    A    B  C
0      1  NaN    x  x
1      2    y  NaN  y
2      3    z  NaN  z
3      4  NaN    a  a
4      5  NaN    b  b

这些都在做完全相同的事情吗?我正在尝试跟进,它们看起来会以相同的方式行为(除了这个特定的例子)? - roganjosh
1
几乎是一样的事情。fillna 假设你已经有要填充的空值。mask 在同一个方法调用中创建空值并填充它们。combine_first 还将包括传递参数中的新索引。恰好这是来自相同数据帧的另一列,因此是相同的索引。 - piRSquared
感激不尽。结合您的评论,这对我来说是一个极好的资源 :) - roganjosh

7

在多列的情况下,您可以使用向前填充。此示例假定您想要构建所有列“A”到“Z”的组合:

df['AZ'] = df.loc[:,'A':'Z'].fillna(method='ffill',axis=1)['Z']

这种方法同样适用于两列:
df['C'] = df.loc[:,'A':'B'].fillna(method='ffill',axis=1)['B']
#0    x
#1    y
#2    z
#3    a
#4    b

1
如果我想要从中提取值放入新列的列不是按顺序排列的,那么这将如何工作? - kflaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接