Pandas select 两列之一的首选值以创建新列

Pandas select preferred value from one of two columns to make a new column

我有一个 Pandas DataFrame,其中包含两列 "complementary" 数据。对于任何给定的行,有 3 种可能性:

1) 列 A 有一个非空值,列 B 有一个空值 NaN,我想用列 [=15] 中的非空值替换=].
2) 列 A 有一个空值 NaN,我想将其替换为列 B.
中的非空值 3) AB 两列都有空值 NaN,这意味着我将保留 NaN 作为该行的值。

这是我的 DataFrame 的简化版本:

df1 = pd.DataFrame({'A' : ['keep1', np.nan, np.nan, 'keep4', np.nan], 
                   'B' : [np.nan, 'keep2', np.nan, np.nan, np.nan]})

我想作为一个中间步骤,我会创建一个新列 C,其中包含我需要的条目:

df2 = pd.DataFrame({'A' : ['keep1', np.nan, np.nan, 'keep4', np.nan], 
                    'B' : [np.nan, 'keep2', np.nan, np.nan, np.nan],
                    'C' : ['keep1', 'keep2', np.nan, 'keep4', np.nan]}

然后我会删除前两行 AB:

df_final = df2.drop(['A', 'B'], axis=1)

我的实际 DataFrame 有数百行,我尝试了几种方法(布尔过滤器、使用 iterrows 遍历 DataFrame、使用 DataFrame.where())但都没有成功。我认为这将是一个简单的问题,但我没有看到。感谢任何帮助。

谢谢

您可以使用 combine_first() 从 B 填补 A 中的空白:

df1['C'] = df1['A'].combine_first(df1['B'])
#0    keep1
#1    keep2
#2      NaN
#3    keep4
#4      NaN

使用 Series.fillnaA 中的缺失值替换为 B 值:

df1['C'] = df1.A.fillna(df1.B)
print (df1)
      A      B      C
0  keep1    NaN  keep1
1    NaN  keep2  keep2
2    NaN    NaN    NaN
3  keep4    NaN  keep4
4    NaN    NaN    NaN

为避免 drop 可能使用 DataFrame.pop 提取列:

df1['C'] = df1.pop('A').fillna(df1.pop('B'))
print (df1)
       C
0  keep1
1  keep2
2    NaN
3  keep4
4    NaN