Pandas同时merge多个表

发布时间 2023-11-14 00:25:54作者: GEOLI

在工作或科研中,往往需要同时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],
    })

分别在jupyter notebook中display四个表单
image

然后调用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
)

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