我有一个用例,其中一个 Excel 文件中有多个工作表 [可以是任意数量的文件],每张工作表中的列可以是任何列,但我只想要所有工作表中的“卷号”、“简介”与每张纸合并为新纸中的一列。
例如。
如果“ClassA”是工作表名称并且内容是
Roll Number Brief email
11 Maths 11 abc@abc
11 Science 12 abc@abc
12 History
如果“ClassB”是工作表名称且内容是
Roll Number Brief email
11 Art 71 abc@abc
13 Science 12 abc@abc
12 Maths
我需要的输出是
Roll Number ClassA ClassB
11 Maths 11 Art 71
11 Science 12
12 History Maths
13 Science 12
所以我需要按卷号合并 df 并想要后续的“简要”列信息
尝试过
xls = pd.ExcelFile(inputfile)
sheet_names = xls.sheet_names
print(sheet_names)
combined_df = None
for sheet in sheet_names:
df = pd.read_excel(xls, sheet_name=sheet)
df = df[['Roll Number', 'Brief']]
df = df.rename(columns={'Brief': sheet})
if combined_df is None:
combined_df = df
else:
combined_df = pd.merge(combined_df, df, on='Roll Number', how='outer')
print(combined_df)
combined_df.to_excel('combined2.xlsx', index=False)
例如,这会创建重复项或有些不规则
Roll Number ClassA ClassB
11 Maths 11 Art 71
11 Science 12 Art 71
12 History Maths
13 Science 12
示例代码
我为您的示例创建了一个字典,其中sheet_name作为键,dataframe作为值。
import pandas as pd
data1 = {'Roll Number': [11, 11, 12],
'Brief': ['Maths 11', 'Science 12', 'History'],
'email': ['abc@abc', 'abc@abc', None]}
data2 = {'Roll Number': [11, 13, 12],
'Brief': ['Art 71', 'Science 12', 'Maths'],
'email': ['abc@abc', 'abc@abc', None]}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
df_dict = {'ClassA': df1, 'ClassB': df2}
df_dict:
{'ClassA': Roll Number Brief email
0 11 Maths 11 abc@abc
1 11 Science 12 abc@abc
2 12 History None,
'ClassB': Roll Number Brief email
0 11 Art 71 abc@abc
1 13 Science 12 abc@abc
2 12 Maths None}
代码
df_dict
-> 你想要的输出
我认为
concat
比循环中的merge
更好
dfs = [
df[['Roll Number', 'Brief']].assign(cc=df.groupby('Roll Number').cumcount())
.set_index(['Roll Number', 'cc'])
.rename({'Brief': sheet}, axis=1)
for sheet, df in df_dict.items()
]
out = pd.concat(dfs, axis=1).droplevel(1).reset_index()
输出:
Roll Number ClassA ClassB
0 11 Maths 11 Art 71
1 11 Science 12 NaN
2 12 History Maths
3 13 NaN Science 12
现在从你的Excel文件中制作
df_dict
。
df_dict = pd.read_excel('your_file_path', sheet_name=None)
sheet_name=None
中的read_excel
在所有工作表中制作工作表名称和工作表数据框的字典。
文档:read_excel
如果代码部分中的列表理解难以理解,请将其替换为for循环,如下所示:
dfs = []
for sheet, df in df_dict.items():
df = df[['Roll Number', 'Brief']]
df['cc'] = df.groupby('Roll Number').cumcount()
df = df.set_index(['Roll Number', 'cc']).rename({'Brief': sheet}, axis=1)
dfs.append(df)
out = pd.concat(dfs, axis=1).droplevel(1).reset_index()