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()条件)的行。