我有一个奇怪的要求,很容易理解,但在我看来实现起来应该很复杂。我有一个由多个电子表格 excel 组成的数据框(使用 df concat)。
我想使用所有 df 名称(Excel 电子表格名称)来命名我的所有行,以了解该行来自哪个电子表格。因为此后,我将混合这些数据。
感谢您的时间/帮助:)
使用 df 名称作为行名称。
假设我们有一个这样的 Excel 工作簿:
pd.read_excel
和 sheet_name=None
将其读入字典,并以工作表名称作为键:
import pandas as pd
file_name = 'myfile.xlsx'
dict_df = pd.read_excel(file_name, sheet_name=None)
dict_df
{'Sheet1': Col1 Col2
0 A 1
1 B 2
2 C 3,
'Sheet2': Col1 Col2
0 D 4
1 E 5
2 F 6}
pd.concat
将字典键添加到索引值中。例如,使用 df.add_prefix
:
df = pd.concat([v.add_prefix(f"{k}_", axis=0) for k, v in dict_df.items()])
df
Col1 Col2
Sheet1_0 A 1
Sheet1_1 B 2
Sheet1_2 C 3
Sheet2_0 D 4
Sheet2_1 E 5
Sheet2_2 F 6
但是,使用
keys
和 names
参数将工作表名称添加为单独的级别可能会更好:
df = pd.concat([v for v in dict_df.values()],
keys=dict_df.keys(),
names=['Sheets', 'Rows'])
df
Col1 Col2
Sheets Rows
Sheet1 0 A 1
1 B 2
2 C 3
Sheet2 0 D 4
1 E 5
2 F 6
例如,这样您就可以轻松选择特定的工作表:
df.loc['Sheet1']
Col1 Col2
Rows
0 A 1
1 B 2
2 C 3
如果您正在读取多个 Excel 工作簿并且还想包含文件名,您可以执行以下操作:
workbooks = ['myfile.xlsx', 'myfile2.xlsx'] # `myfile2` here a copy of `myfile`
nested_dict = {(wb,k): v for wb in workbooks
for k, v in pd.read_excel(wb, sheet_name=None).items()}
df = pd.concat([v for v in nested_dict.values()],
keys=nested_dict.keys(),
names=['Filename', 'Sheets', 'Rows'])
df
Col1 Col2
Filename Sheets Rows
myfile.xlsx Sheet1 0 A 1
1 B 2
2 C 3
Sheet2 0 D 4
1 E 5
2 F 6
myfile2.xlsx Sheet1 0 A 1
1 B 2
2 C 3
Sheet2 0 D 4
1 E 5
2 F 6