连接所有 sheet 个文件并在 Python 中创建一个包含 sheet 个名称的新列

Concatenate all sheet files and create one new column with sheet names in Python

给定一个 excel 文件 test.xlsx,其中有许多 sheet:1.DC2.SH3.GZ

import xlrd
dfs = xlrd.open_workbook('./test.xlsx', on_demand = True)
print(dfs.sheet_names()) 

输出:

['1.DC', '2.SH', '3.GZ']

我如何读取并连接所有 sheet 并创建一个包含 sheet 名称的新列,同时删除每个 sheet 名称开头部分的 1., 2., 3., etc.

预期的结果是这样的:

使用 read_excelsheet_name=None 将所有工作表转换为 DataFrames:

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

dfs = {k: v.loc[:, ~v.columns.str.contains('Unnamed')] for k, v in dfs.items()}

# print(dfs) 

然后如果需要一列,请使用 lsit comparehension 与 select 这一列,此处 name

df = pd.DataFrame([(x, k) for k, v in dfs.items() for x in v['name']], 
                  columns=['name','city'])
df['city'] = df['city'].str.replace('^[0-9\.]+', '')
print (df)
      name    city
0    James      DC
1     Bond      DC
2   Steven      DC
3   Walker      SH
4      Tom      SH
5   Filler      GZ
6   Cooker      GZ
7      Tim      GZ

或者如果需要所有列在这里省略 [name]:

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

df = (pd.concat(dfs)
        .reset_index(level=1, drop=True)
        .rename_axis('city')['name']
        .reset_index())
df['city'] = df['city'].str.replace('^[0-9\.]+', '')
print (df)
      city    name
0       DC   James
1       DC    Bond
2       DC  Steven
3       SH  Walker
4       SH     Tom
5       GZ  Filler
6       GZ  Cooker
7       GZ     Tim