我有一个 Excel 文件foo.xlsx
约40张sh1
, sh2
等。每张纸的格式为:
area cnt name\nparty1 name\nparty2
blah 9 5 5
word 3 7 5
在每张表中,我想用以下格式重命名变量name\nparty
只拥有party
作为标签。输出示例:
area cnt party1 party2 sheet
bacon 9 5 5 sh1
spam 3 7 5 sh1
eggs 2 18 4 sh2
我正在阅读文件:
book = pd.ExcelFile(path)
然后想知道我是否需要这样做:
for f in filelist:
df = pd.ExcelFile.parse(book,sheetname=??)
'more operations here'
# only change column names 2 and 3
i, col in enumerate(df):
if i>=2 and i<=3:
new_col_name = col.split("\n")[-1]
df[new_col_name] =
或类似的东西?
The read_excel
的方法pandas
如果您设置关键字参数,则可以一次读取所有工作表sheet_name=None
(在某些旧版本中pandas
这被称为sheetname
)。这将返回一个字典 - 键是工作表名称,值是作为数据帧的工作表。
使用它,我们可以简单地循环字典并:
- 向包含相关工作表名称的数据框添加额外的列
- Use the
rename
重命名我们的列的方法 - 通过使用lambda
,我们只需在出现新行时获取通过拆分每个列名称而获得的列表的最终条目。如果没有换行,则列名不变。
- 追加到列表中,在末尾合并。
完成此操作后,我们将所有工作表合并为一张pd.concat
。然后我们重置索引,一切都会好起来的。注意:如果您在一张纸上有参与方,但没有其他参与方,这仍然有效,但会用以下内容填充每张纸的任何缺失列NaN
.
import pandas as pd
sheets_dict = pd.read_excel('Book1.xlsx', sheet_name=None)
all_sheets = []
for name, sheet in sheets_dict.items():
sheet['sheet'] = name
sheet = sheet.rename(columns=lambda x: x.split('\n')[-1])
all_sheets.append(sheet)
full_table = pd.concat(all_sheets)
full_table.reset_index(inplace=True, drop=True)
print(full_table)
Prints:
area cnt party1 party2 sheet
0 bacon 9 5 5 Sheet1
1 spam 3 7 5 Sheet1
2 eggs 2 18 4 Sheet2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)