用索引名称命名所有行

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

我有一个奇怪的要求,很容易理解,但在我看来实现起来应该很复杂。我有一个由多个电子表格 excel 组成的数据框(使用 df concat)。

我想使用所有 df 名称(Excel 电子表格名称)来命名我的所有行,以了解该行来自哪个电子表格。因为此后,我将混合这些数据。

感谢您的时间/帮助:)

使用 df 名称作为行名称。

python pandas dataframe indexing
1个回答
0
投票

假设我们有一个这样的 Excel 工作簿:

Excel workbook with 2 sheets

我们可以使用

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
© www.soinside.com 2019 - 2024. All rights reserved.