python - 三个数据框的交叉连接
问题描述
我想加入以下结构的三个数据框:
january_df=pd.DataFrame({
'January':[4,4,3,2,1,1],
'Product_no':['B1','B2','S1','S2','B3','T1'],
'Label':['Ball','Bikini','Shoe','Shirt','Bag','Towel'],
'ID':[1000, 1001, 1002, 1003, 1004, 1005],
})
february_df=pd.DataFrame({
'February':[4,3,3,2,1,1],
'Product_no':['S1','B2','B1','T1','S2','B3'],
'Label':['Shoe','Bikini','Ball','Towel','Shirt','Bag'],
'ID':[1002, 1001, 1000, 1005, 1003, 1004],
})
march_df=pd.DataFrame({
'March':[5,1,1,1,1,1],
'Product_no':['T1','E1','S1','B3','L1','B1'],
'Label':['Towel','Earring','Shoe','Bag','Lotion','Ball'],
'ID':[1005, 1006, 1002, 1004, 1007, 1000],
})
三月的期望输出应该是:
January February March Product_no Label ID
---------------------------------------------------------
01 1 2 5 T1 Towel 1005
02 0 0 1 E1 Earring 1006
03 3 4 1 S1 Shoe 1002
04 1 1 1 B3 Bag 1004
05 0 0 1 L1 Lotion 1006
06 4 3 1 B1 Ball 1000
第一步,我尝试合并三月和二月
all_df = pd.merge(march_df, february_df, on="ID")
但它并没有产生两个月的结果。我试图通过 pandas 和 pandas 三向连接列上的多个数据帧来理解有关高性能笛卡尔积 (CROSS JOIN)的提示, 但没有得到任何更明智的结果。
在 R 中,它可以作为“管道多重连接”来实现
threeMonths <- February%>%
right_join(March)%>%
left_join(January)
我似乎无法将其翻译成 Python。
如何获得所需的输出?
解决方案
您可以分两步合并。以三月为例:
tmp = pd.merge(january_df, february_df, on='ID')
final_df = pd.merge(tmp, march_df, on='ID', how='right')[['January', 'February', 'March', 'Product_no', 'Label', 'ID']].fillna(0)
print(final_df)
印刷:
January February March Product_no Label ID
0 1.0 2.0 5 T1 Towel 1005
1 0.0 0.0 1 E1 Earring 1006
2 3.0 4.0 1 S1 Shoe 1002
3 1.0 1.0 1 B3 Bag 1004
4 0.0 0.0 1 L1 Lotion 1007
5 4.0 3.0 1 B1 Ball 1000
推荐阅读
- mysql - MYSQL 语法帮助
- css - Bootstrap 4 - 向上滚动时避免缩小导航栏
- python - 如何从 Python 中的 REST 响应中获取嵌套的 JSON 对象
- matlab - 尝试加载 Fieldtrip .mat Matlab 文件并发现 EEG 事件
- c++ - Gcc 错误优化 sse 函数
- scala - 如何在 Spark 的空 Dataframe 中添加行记录
- git - 如何从分叉的仓库中比较 github 中的本地分支?
- python - 如果在 Python 中找不到文件,如何使代码执行某些操作?
- java - 如何将动态加载的单选按钮放入一个组中?
- php - Laravel-在模型实例上设置原始属性值(绕过强制转换逻辑)