仅在 Pandas 中的值为 Empty/Null 时合并
Merge Only When Value is Empty/Null in Pandas
我在 Pandas 中有两个数据帧正在合并在一起 df.A 和 df.B,df.A 是原始的,而 df.B 有新的我要带过来的数据。合并工作正常,正如预期的那样,我在合并的 df.
中得到两列 col_x 和 col_y
但是,在某些行中,原始 df.A 具有其他 df.B 没有的值。我的问题是,如何有选择地从 col_x 和 col_y 中获取值并将它们放入新的列中,例如 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
任何帮助或指出正确的方向将不胜感激!
谢谢
好的,假设您的 (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
IMO 最短但可读的解决方案是这样的:
df.A.loc[df.A['col'].isna(), 'col'] = df.A.merge(df.B, how='left', on='date')['col_y']
它基本上做的是将合并的 table 列 col_y
中的值分配给主 df.A
table,对于 col
列中的那些行,这为空(.isna()
条件)。
如果你有包含 'nans' 的数据并且你想从其他数据帧中填充 'nans'
(匹配索引和列名称)您可以执行以下操作:
df_A : 包含 nans 元素的目标 DataFrame
df_B : 完成缺失元素的源 DataFrame
df_A = df_A.where(df_A.notnull(),df_B)
我在 Pandas 中有两个数据帧正在合并在一起 df.A 和 df.B,df.A 是原始的,而 df.B 有新的我要带过来的数据。合并工作正常,正如预期的那样,我在合并的 df.
中得到两列 col_x 和 col_y但是,在某些行中,原始 df.A 具有其他 df.B 没有的值。我的问题是,如何有选择地从 col_x 和 col_y 中获取值并将它们放入新的列中,例如 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
任何帮助或指出正确的方向将不胜感激!
谢谢
好的,假设您的 (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
IMO 最短但可读的解决方案是这样的:
df.A.loc[df.A['col'].isna(), 'col'] = df.A.merge(df.B, how='left', on='date')['col_y']
它基本上做的是将合并的 table 列 col_y
中的值分配给主 df.A
table,对于 col
列中的那些行,这为空(.isna()
条件)。
如果你有包含 'nans' 的数据并且你想从其他数据帧中填充 'nans'
(匹配索引和列名称)您可以执行以下操作:
df_A : 包含 nans 元素的目标 DataFrame
df_B : 完成缺失元素的源 DataFrame
df_A = df_A.where(df_A.notnull(),df_B)