Pandas同时merge多个表

Merge(连接)是Pandas中一个常用的功能,可以快捷的根据一个或多个公共字段完成两个表单(DataFrame)的拼接。具体使用方式大概如下所示,由于不是本文重点,因此具体API的用法大家可以参考

new_df = pandas.merge([df1, df2], on='key', how='left')

pandas.DataFrame.merge — pandas 2.0.3 documentation (pydata.org)
​pandas.pydata.org/docs/reference/api/pandas.DataFrame.merge.html

在工作或科研中,往往需要同时merge多个表单;但是pandas没有提供诸如pandas.mege([df1,df2,df3,df4],...)这样的接口。如果表单数量少还好,我们可以通过重复上面的代码完成。但是这样做,一方面不是很“优雅”,另一方面,当表单很多,比如逐日的气象数据,那冗余代码量是巨大的。

当遇到这种问题,可以使用python内置的functools库提供的reduce功能,实现一行代码Merge多个表单的功能。以下为代码演示:

首先我们定义四组表单数据。

import pandas as pd
import functools
df1 = pd.DataFrame({
"Name":['zhao','qian','sun','li','zhou','wu'],
"Age":[21,23,20,20,24,23],
"Grade-1":[100,99,90,98,99,95],
})
df2 = pd.DataFrame({
"Name":['zhao','qian','sun','li','zhou','wu'],
"Age":[21,23,20,20,24,23],
"Grade-2":[65,66,65,68,70,72],
})
df3 = pd.DataFrame({
"Name":['zhao','qian','sun','li','zhou','wu'],
"Age":[21,23,20,20,24,23],
"Grade-3":[77,88,99,100,88,55],
})
df4 = pd.DataFrame({
"Name":['zhao','qian','sun','li','zhou','wu'],
"Age":[21,23,20,20,24,23],
"Grade-4":[60,60,61,61,61,60],
})

image

分别在jupyter notebook中display四个表单
然后调用reduce函数,将pd.merge函数递归应用于四个表单

df = functools.reduce(
lambda left, right: pd.merge(left, right, how='left',on=['Name','Age']),
[df1,df2,df3,df4]
)
print(df)

有人会说,你这不也是把df1-4遍历了一遍呀

那如果把四个变量用list存起来就大不一样了,比如读取某个文件夹下的全部温度数据,并merge:

all_files = []
for fn in glob.glob("../data/temp*.csv"):
all_files.append(pandas.read_csv(fn))
df = functools.reduce(
lambda left, right: pd.merge(left, right, how='left',on=['Name','Age']),
all_files
)

这么看,代码量是不是指数级减少了?并且优雅了许多。

posted @   GeoRepublic  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示