Pandas同时merge多个表
在工作或科研中,往往需要同时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四个表单
然后调用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
)
这么看,代码量是不是指数级减少了?并且优雅了许多。