合并来自多个excel的一张表的数据
Posted
技术标签:
【中文标题】合并来自多个excel的一张表的数据【英文标题】:Combine data of one sheet from multiple excels 【发布时间】:2018-09-11 12:02:25 【问题描述】:我有多个以下格式的 excel 文件:
ID | Name | Prop1 | Prop2 | User
来自 excel1 的数据:
ID | Name | Prop1 | Prop2 | Prop3 | User
1 | test | | | | John
来自 Excel2 的数据:
ID | Name | Prop1 | Prop2 | Prop3 | User
1 | test | a | b | | John
来自 Excel3 的数据:
ID | Name | Prop1 | Prop2 | Prop3 | User
1 | test | | | c | John
我想要做的是组合这些单元格。
期望的输出:
ID | Name | Prop1 | Prop2 | Prop3 | User
1 | test | a | b | c | John
如果一个文件的单元格为空,而另一个文件中有值,我想替换它。
有什么简单的方法可以做到吗?
谢谢。
【问题讨论】:
您希望输出的外观如何? 1 单行还是多行?到目前为止,您尝试过什么? 我已更新问题以获得所需的输出。 解决方案有问题吗?如果不需要reduce
部分,则已编辑答案。
【参考方案1】:
您可以通过glob
创建所有DataFrames 的列表,最终df
需要combine_first
和reduce:
import glob
from functools import reduce
files = glob.glob('files/*.xlsx')
dfs = [pd.read_excel(fp).set_index(['ID','Name','User']) for fp in files]
df1 = reduce(lambda l,r: pd.DataFrame.combine_first(l,r), dfs)
print (df1)
Prop1 Prop2 Prop3
ID Name User
1 test John a b c
编辑:如果不需要将文件与NaN
s 合并,解决方案更简单:
import glob
files = glob.glob('files/*.xlsx')
df = pd.concat([pd.read_excel(fp) for fp in files],ignore_index=True)
【讨论】:
如果文件相同则更正,但我认为 OP 提到了不同的文件名。 文件名在这里我猜是无关紧要的。但我在Python 2.7.13
中安装 functools 时遇到问题。
@DarthVader - 我认为没有必要安装,检查this。我认为对于2.7
python 只需要删除from functools import reduce
【参考方案2】:
试试下面:
df1 = pd.read_excel('Excel1.xlsx', sheetname='Sheet1');
df2= pd.read_excel('Excel2.xlsx', sheetname='Sheet1');
df3 = pd.read_excel('Excel3.xlsx', sheetname='Sheet1')
mylist = [df1,df2,d3]
df = pd.merge(df1, df2, on=['ID','USER'])
df = pd.merge(df, df3, on=['ID','USER'])
writer = pd.ExcelWriter('pandas_simple.xlsx', engine='xlsxwriter')
# Convert the dataframe to an XlsxWriter Excel object.
df.to_excel(writer, sheet_name='Sheet1')
# Close the Pandas Excel writer and output the Excel file.
writer.save()
我没有机会对此进行测试,但它应该可以工作。
【讨论】:
嗨 Rehan,你能看看这个问题吗?我需要上述所需的输出。不是简单的连接。【参考方案3】:这应该做你想做的。
import pandas as pd
import numpy as np
import glob
glob.glob("C:/your_path_here/*.xlsx")
all_data = pd.DataFrame()
for f in glob.glob("C:/your_path_here/*.xlsx"):
df = pd.read_excel(f)
all_data = all_data.append(df,ignore_index=True)
print(all_data)
【讨论】:
以上是关于合并来自多个excel的一张表的数据的主要内容,如果未能解决你的问题,请参考以下文章
如何将SQL Server中多个表的数据一次性返回到一张EXCEL工作表(Sheet)中