Pandas:使用多张工作表导入 xlsx,将列添加到每个 df 及其所属工作表的名称,将具有相同列数的 df 连接起来

Posted

技术标签:

【中文标题】Pandas:使用多张工作表导入 xlsx,将列添加到每个 df 及其所属工作表的名称,将具有相同列数的 df 连接起来【英文标题】:Pandas: Import xlsx with several sheets, add column to each df's with sheet’s name to which it belongs, concatenate df's with same number of columns 【发布时间】:2021-11-09 02:59:17 【问题描述】:

给定以下测试文件:

https://docs.google.com/spreadsheets/d/1rRUZirjPj2cBeaukUG8ngEowv80Nqg6N/edit?usp=sharing&ouid=100016243141159098340&rtpof=true&sd=true

我需要导入具有 4 张工作表的 .xlsx 文件(这只是一个示例,我的原始文件还有更多工作表),在每个 df 中添加一列及其所属的工作表名称,然后连接结果df 与具有相同列数的那些。

在这个例子中,我有两张有 2 列的工作表(我希望它们在同一个数据框中),另外两张有一列的工作表(我只希望在一个数据框中)。

到目前为止我做了什么?

my_dict = pd.read_excel('test.xlsx',header=0, sheet_name=None) #the output is a dictionary

for key, df in my_dict.items():
    df['sheet_name'] = key # This code creates a new column in each dataframe with the name of the sheet.

我不知道如何连接字典内的数据框,按每个数据框的列数对它们进行分组。这里的结果将是两个不同的 df。

【问题讨论】:

具有两列的数据框有不同的名称(A,B vs C, D)你如何处理 【参考方案1】:

读入数据:

xlsx = pd.read_excel('test.xlsx', sheet_name = None)

创建两个变量,一个包含有两列的数据框,另一个包含只有一列的数据框:

two = key:value for key,value in xlsx.items() if value.columns.size == 2
one = key:value for key,value in xlsx.items() if value.columns.size == 1

分别连接 twoone

two = pd.concat(two, names = ['sheet_name', None]).droplevel(-1).reset_index()

two

  sheet_name    A    B    C    D
0        JFK  1.0  2.0  NaN  NaN
1        JFK  5.0  6.0  NaN  NaN
2        MIA  NaN  NaN  1.0  1.0
3        MIA  NaN  NaN  2.0  2.0



 one = pd.concat(one, names = ['sheet_name', None]).droplevel(-1).reset_index()

one 

sheet_name  z
0        SJU  1
1        SJU  2
2        BCN  3
3        BCN  4

如果希望两列数据框具有相同的列名,可以在字典过滤阶段进行预处理:

two = key:value.set_axis(['A', 'B'], axis = 'columns') 
       for key,value in xlsx.items() 
       if value.columns.size == 2

# concatenation will result in only three columns:

two = pd.concat(two, names = ['sheet_name', None]).droplevel(-1).reset_index()

two

  sheet_name  A  B
0        JFK  1  2
1        JFK  5  6
2        MIA  1  1
3        MIA  2  2

【讨论】:

以上是关于Pandas:使用多张工作表导入 xlsx,将列添加到每个 df 及其所属工作表的名称,将具有相同列数的 df 连接起来的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Julia 创建具有多张工作表的 excel 文件?

R使用值而不是公式导入Excel文件(多张)

pandas对excel遍历读取与填充:涉及多张表的保存NAN的类型处理NAN的处理(str类型下)

Python:在多张工作表上将 Pandas DataFrame 写入 Excel 的最快方法

Pandas:将列转换为唯一列表

Python使用pandas导入xlsx格式的excel文件内容