仅当 Pandas 中的值为空/空时才合并

Posted

技术标签:

【中文标题】仅当 Pandas 中的值为空/空时才合并【英文标题】:Merge Only When Value is Empty/Null in Pandas 【发布时间】:2015-07-29 13:54:38 【问题描述】:

我在 Pandas 中有两个数据框,它们正在合并在一起 df.A 和 df.B,df.A 是原始数据,而 df.B 有我想要带来的新数据。合并工作正常,正如预期的那样,我在合并的 df 中得到两列 col_x 和 col_y。

但是,在某些行中,原始 df.A 具有其他 df.B 没有的值。我的问题是,如何有选择地从 col_x 和 col_y 中获取值并将它们放入新的 col 中,例如 col_z ?

这就是我的意思,我如何合并 df.A:

date   impressions    spend    col
1/1/15 100000         3.00     ABC123456
1/2/15 145000         5.00     ABCD00000
1/3/15 300000         15.00    (null)

与 df.B

date    col
1/1/15  (null)
1/2/15  (null)
1/3/15  DEF123456

获得:

date   impressions    spend    col_z
1/1/15 100000         3.00     ABC123456
1/2/15 145000         5.00     ABCD00000
1/3/15 300000         15.00    DEF123456

非常感谢任何帮助或指出正确方向!

谢谢

【问题讨论】:

显示无效的代码。 【参考方案1】:

好的,假设您的 (null) 值实际上是 NaN 值而不是那个字符串,那么以下工作:

In [10]:
# create the merged df
merged = dfA.merge(dfB, on='date')
merged

Out[10]:
        date  impressions  spend      col_x      col_y
0 2015-01-01       100000      3  ABC123456        NaN
1 2015-01-02       145000      5  ABCD00000        NaN
2 2015-01-03       300000     15        NaN  DEF123456

您可以使用where 有条件地从 _x 和 _y 列中分配一个值:

In [11]:
# now create col_z using where
merged['col_z'] = merged['col_x'].where(merged['col_x'].notnull(), merged['col_y'])
merged

Out[11]:
        date  impressions  spend      col_x      col_y      col_z
0 2015-01-01       100000      3  ABC123456        NaN  ABC123456
1 2015-01-02       145000      5  ABCD00000        NaN  ABCD00000
2 2015-01-03       300000     15        NaN  DEF123456  DEF123456

然后你可以drop无关的列:

In [13]:

merged = merged.drop(['col_x','col_y'],axis=1)
merged

Out[13]:
        date  impressions  spend      col_z
0 2015-01-01       100000      3  ABC123456
1 2015-01-02       145000      5  ABCD00000
2 2015-01-03       300000     15  DEF123456

【讨论】:

如何合并多个列我正在重复执行任务以获得最终输出,但想知道是否有更简洁的方法``` obs_table['value'] = obs_table['value_coded'].where (obs_table['value_coded'].notnull(),obs_table['value_numeric']) obs_table['value'] = obs_table['value'].where(obs_table['value'].notnull(),obs_table['value_text ']) obs_table['value'] = obs_table['value'].where(obs_table['value'].notnull(),obs_table['value_datetime']) obs_table['value'] = obs_table['value'] .where(obs_table['value'].notnull(),obs_table['value_datetime']) ``【参考方案2】:

IMO 最短但可读的解决方案是这样的:

df.A.loc[df.A['col'].isna(), 'col'] = df.A.merge(df.B, how='left', on='date')['col_y']

它的基本作用是将合并表列col_y 中的值分配给主df.A 表,对于col 列中为空的那些行(.isna() 条件)。

【讨论】:

非常干净...谢谢!要合并多个列,请将 on=' ' 更改为列表。【参考方案3】:

如果您有包含“nans”的数据,并且您想从其他数据框中填充“nans” (匹配索引和列名称)您可以执行以下操作:

df_A : 包含 nans 元素的目标 DataFrame

df_B:补全缺失元素的源DataFrame

df_A = df_A.where(df_A.notnull(),df_B)

【讨论】:

以上是关于仅当 Pandas 中的值为空/空时才合并的主要内容,如果未能解决你的问题,请参考以下文章

仅当集合为空时才弹出值的直觉

MSSQL - 仅当所有值都不为空时才插入值

SwiftUI:仅当输入不为空时才启用保存按钮

JPA:仅当结果集不为空时才缓存查询

仅当对象在一行上不为空时才设置属性[重复]

MongoDb 仅当数组不为空时才在数组中添加字段