我有5个数据框,如下所示:
df1:
provinceCode provinceName
0 11 XXX
1 12 XXX
2 13 XXX
3 14 XXX
4 15 XXX
df2:
cityCode cityName provinceCode
0 1101 XXX 11
1 1201 XXX 12
2 1301 XXX 13
3 1302 XXX 13
4 1303 XXX 13
df3:
areaCode areaName cityCode provinceCode
0 110101 XXX 1101 11
1 110102 XXX 1101 11
2 110105 XXX 1101 11
3 110106 XXX 1101 11
4 110107 XXX 1101 11
df4:
streetCode streetName areaCode provinceCode cityCode
0 110101001 XXX 110101 11 1101
1 110101002 XXX 110101 11 1101
2 110101003 XXX 110101 11 1101
3 110101004 XXX 110101 11 1101
4 110101005 XXX 110101 11 1101
df5:
villageCode villageName streetCode provinceCode cityCode areaCode
0 110101001001 XXX 110101001 11 1101 110101
1 110101001002 XXX 110101001 11 1101 110101
2 110101001005 XXX 110101001 11 1101 110101
3 110101001006 XXX 110101001 11 1101 110101
4 110101001007 XXX 110101001 11 1101 110101
我希望将所有df合并在一起,尤其是它们的名称和代码列。我尝试过将它们逐一合并,这是非常低效的。只是想知道是否有更好的方法可以做到这一点?谢谢。 这是我尝试过的:
df6 = df5.merge(df4[['code', 'name']], left_on = 'provinceCode', right_on = 'code', how = 'left')
df7 = df6.merge(df3[['code', 'name']], left_on = 'areaCode', right_on = 'code', how = 'left')
df8 = df7.merge(df2[['code', 'name']], left_on = 'areaCode', right_on = 'code', how = 'left')
df = df8.merge(df1[['provinceCode', 'provinceName']], left_on = 'provinceCode', right_on = 'code', how = 'left')
答案 0 :(得分:1)
@OP提供更新的答案:
dfs = [df1, df2, df3, df4, df5]
from functools import partial
outer_merge = partial(pd.merge, how='outer')
reduce(outer_merge, dfs)
(旧答案-不要使用)
您不必在每个圆圈上创建变体。链接它们:
df= df5.merge(df4[['code', 'name']],
left_on='provinceCode',
right_on='code',
how='left'
).merge(df3[['code', 'name']],
left_on='areaCode',
right_on='code',
how = 'left'
).merge(df2[['code', 'name']],
left_on='areaCode',
right_on='code',
how ='left'
).merge(df1[['provinceCode', 'provinceName']],
left_on='provinceCode',
right_on='code',
how='left')
更新:Reduce在简单性和速度上非常出色,但是为了易于阅读,与合并相比,它的可读性更差:我们可以将代码干燥:
common_joins = dict(right_on='code', how='left')
common_columns = ['code', 'name']
df= df5.merge(df4[common_columns],
left_on='provinceCode',
**common_joins
).merge(df3[common_columns],
left_on='areaCode',
**common_joins
).merge(df2[common_columns],
left_on='areaCode',
**common_joins
).merge(df1[['provinceCode', 'provinceName']],
left_on='provinceCode',
**common_joins)