python-3.x - Pandas 从两列之一中选择首选值来创建一个新列

标签 python-3.x pandas dataframe series

我有一个包含两列“互补”数据的 Pandas DataFrame。对于任何给定的行,有 3 种可能性:

1) A 列有一个非空值,B 列有一个空值 NaN,我想将其替换为来自A 列。
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 有数百行,我尝试了几种方法( bool 过滤器、使用 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

关于python-3.x - Pandas 从两列之一中选择首选值来创建一个新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59133159/

相关文章:

python - __dict__ 不知道类的某些属性

pandas - 在 bool 选择中使用 MultiIndex 值(设置时)

python - 使用指定的十进制位数格式化 pandas 数据框的数字列

python - 根据 timedelta 列中的总秒数过滤 DataFrame

python - 如何在python中添加列表的总和

python-3.x - 关于 pip 和 conda 环境的困惑

python - python3中使用置换循环形成新数组

python/pandas 从开始日期+时间,创建日期时间索引

python - 如何在没有索引的情况下将数据框转换为 Pandas 中的字典

python - 用两列取消融化 Pandas 数据框