[英]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.isin
按cod
过滤,然后在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.