合并来自多个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

编辑:如果不需要将文件与NaNs 合并,解决方案更简单:

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)中

多个sheet合并成一个表

Excel 2010 Vlookup函数用法(合并多个组员反馈回来的表格 到 一张表中)

Oracle如何将多次分组求和的数据合并到一张表上?

合并两个excel表格的方法步骤

orale update一张表的字段为另一张表的字段