使用Pandas按多个id列合并多个数据帧

2024-09-27 23:26:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有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

我希望合并所有的dfs,尤其是他们的名称和删除代码列。我试过把它们一个一个地合并起来,效率很低。只是想知道有没有更好的方法来做到这一点?谢谢。 以下是我尝试过的:

^{pr2}$

Tags: 数据xxxdf1df2df3df4df5cityname
1条回答
网友
1楼 · 发布于 2024-09-27 23:26:39

更新的回答由@OP提供:

dfs = [df1, df2, df3, df4, df5] 
from functools import partial 
outer_merge = partial(pd.merge, how='outer') 
reduce(outer_merge, dfs)

(旧答案-不用)

你不必为每个圆创建一个变化。把它们拴起来:

^{pr2}$

更新: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)

相关问题 更多 >

    热门问题