仅在Pandas中值为空/空时合并

时间:2015-05-18 06:54:31

标签: python pandas merge

我在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

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

由于

2 个答案:

答案 0 :(得分:8)

好吧假设你的(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

答案 1 :(得分:0)

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()表中分配值