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

2024-09-22 14:29:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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

但是,在某些行中,原始df.A具有其他df.B不具有的值。我的问题是,我如何有选择地从col廑x和col廑y获取值,并将它们放入col廑z这样的新col中?

我的意思是,如何合并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

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

谢谢


Tags: 数据pandasdf原始数据datecol方向null
2条回答

好的,假设您的(空)值实际上是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

您可以使用^{}从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

然后可以^{}无关列:

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']

它的基本功能是将合并表列col_y中的值赋给主表df.A中的那些行,这些行是空的(.isna()条件)。

相关问题 更多 >