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
分别连接 two
和 one
:
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 文件?
pandas对excel遍历读取与填充:涉及多张表的保存NAN的类型处理NAN的处理(str类型下)