繁体   English   中英

熊猫:在 python 中欺骗左连接

[英]pandas: tricking left join in python

请问我该怎么做才能得到下面的结果。 如果 df_1 的 cod 存在于 df_2 中,那么我应该按照下面的代码中的说明添加该行。

data1 = {'date': ['2021-06', '2021-06', '2021-07', '2021-07', '2021-07', '2021-07'], 'cod': ['12', '12', '14', '15', '15', '18'], 'Zone': ['LA', 'NY', 'LA', 'NY', 'PARIS', 'PARIS'], 'Revenue_Radio': [10, 20, 30, 50, 40, 10]}  


df_1 = pd.DataFrame(data1) 

data2 = {'date': ['2021-06', '2021-06', '2021-07', '2021-07', '2021-08'], 'cod': ['12', '14', '15', '15', '18'], 'Zone': ['PARIS', 'NY', 'LA', 'NY', 'NY'], 'Revenue_Str': [10, 20, 30, 50, 5]}  

df_2 = pd.DataFrame(data2) 

预期的输出是

data_result = {'date': ['2021-06', '2021-06', '2021-06', '2021-07', '2021-07', '2021-07', '2021-07', '2021-07','2021-07'], 'cod': ['12', '12', '12', '14', '14', '15', '15', '15', '18'], 'Zone': ['LA', 'NY', 'PARIS','LA', 'NY', 'NY', 'PARIS', 'LA', 'PARIS'], 'Revenue_Radio': [10, 20, 0,  30, 0, 50, 40, 0, 10], 'Revenue_Str': [0, 0, 10,0, 20, 50, 0, 30, 0]}    
df_result = pd.DataFrame(data_result) 

使用Series.isincod过滤,然后在merge进行外连接,替换NaN和最后一个排序列:

df22 = df_2[df_2['cod'].isin(df_1['cod'])]
df = (df_1.merge(df22, on=['date','cod','Zone'], how='outer')
          .fillna(0)
          .sort_values(['date','cod'], ignore_index=True))
print (df)
      date cod   Zone  Revenue_Radio  Revenue_Str
0  2021-06  12     LA           10.0          0.0
1  2021-06  12     NY           20.0          0.0
2  2021-06  12  PARIS            0.0         10.0
3  2021-06  14     NY            0.0         20.0
4  2021-07  14     LA           30.0          0.0
5  2021-07  15     NY           50.0         50.0
6  2021-07  15  PARIS           40.0          0.0
7  2021-07  15     LA            0.0         30.0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM