将 Excel 文件中的多张工作表合并为一张

问题描述 投票:0回答:1

我有一个用例,其中一个 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
python pandas dataframe group-by merge
1个回答
0
投票

示例代码

我为您的示例创建了一个字典,其中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()
© www.soinside.com 2019 - 2024. All rights reserved.