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

Jon*_*edy 13 python merge pandas

我在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)
Run Code Online (Sandbox Code Playgroud)

与df.B

date    col
1/1/15  (null)
1/2/15  (null)
1/3/15  DEF123456
Run Code Online (Sandbox Code Playgroud)

要得到:

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
Run Code Online (Sandbox Code Playgroud)

任何帮助或指向正确方向的人都会非常感激!

谢谢

EdC*_*ica 12

假设您的(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
Run Code Online (Sandbox Code Playgroud)

您可以使用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
Run Code Online (Sandbox Code Playgroud)

然后你可以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
Run Code Online (Sandbox Code Playgroud)


小智 6

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

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

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