【问题标题】:Import from Excel in Python Pandas and rearrange metadata header as column data在 Python Pandas 中从 Excel 导入并将元数据标题重新排列为列数据
【发布时间】:2020-06-19 04:13:53
【问题描述】:

我尝试将数据从 Excel 导入到 Pandas,但在重新排列肉类数据时遇到问题。

Excel 工作表采用以下格式(此处为简化): Original data

但我想将 Excel 表导入到 Pandas 数据框,然后以这种格式重新排列,以简化 Pandas 中的统计绘图: Final data

我尝试了以下方法,但无法得到正确的格式:

import numpy as np
import pandas as pd
FNAME = 'Original.xlsx'
df = pd.read_excel(FNAME, sheet_name='Sheet1', header = [0,1,2,3])
mi = pd.MultiIndex.from_frame(df)
dfmi = pd.melt(df, id_vars=[mi.names[0]])
# Add column index
col = list(mi.names[0])
col.insert(0,'temp')
col.append('value')
col[-2]='type'
dfmi.columns = col

df
Out[17]: 
                   A     a1                                     
                   B     b1                    b2               
                   C     c1                    c2               
  Unnamed: 0_level_3 Data 1 Data 2  Data 3 Data 1 Data 2  Data 3
0                NaN      1      7      13      4     10      16
1                NaN      2      8      14      5     11      17
2                NaN      3      9      15      6     12      18

dfmi
Out[18]: 
    temp   A   B   C     type  value
0    NaN  a1  b1  c1   Data 1      1
1    NaN  a1  b1  c1   Data 1      2
2    NaN  a1  b1  c1   Data 1      3
3    NaN  a1  b1  c1   Data 2      7
4    NaN  a1  b1  c1   Data 2      8
5    NaN  a1  b1  c1   Data 2      9
6    NaN  a1  b1  c1   Data 3     13
7    NaN  a1  b1  c1   Data 3     14
8    NaN  a1  b1  c1   Data 3     15
9    NaN  a1  b2  c2   Data 1      4
10   NaN  a1  b2  c2   Data 1      5
11   NaN  a1  b2  c2   Data 1      6
12   NaN  a1  b2  c2   Data 2     10
13   NaN  a1  b2  c2   Data 2     11
14   NaN  a1  b2  c2   Data 2     12
15   NaN  a1  b2  c2   Data 3     16
16   NaN  a1  b2  c2   Data 3     17
17   NaN  a1  b2  c2   Data 3     18

我喜欢的 Pandas 格式是:

    A   B   C  Data 1  Data 2  Data 3
0  a1  b1  c1       1       7      13
1  a1  b1  c1       2       8      14
2  a1  b1  c1       3       9      15
3  a1  b2  c2       4      10      16
4  a1  b2  c2       5      11      17
5  a1  b2  c2       6      12      18

但 dfmi 中的值仅堆叠到一列,我想保留三列数据。有没有其他方法可以得到我喜欢的数据格式?

链接到 Excel 文件: Excel file Original data

【问题讨论】:

    标签: excel python-3.x pandas


    【解决方案1】:

    使用链接数据进行测试 - 添加 index_col=0 以将第一列转换为索引,然后通过 DataFrame.reset_indexdrop=True 创建默认索引:

    FNAME = 'Original.xlsx'
    df = pd.read_excel(FNAME, 
                      sheet_name='Sheet1', 
                      header = [0,1,2,3], 
                      index_col=[0]).reset_index(drop=True)
    

    可以通过DataFrame.unstackSeries.unstack 进行整形,然后通过DataFrame.reset_index 删除第四级并将所有其他级别转换为列:

    df = df.unstack().unstack(3).reset_index(level=3, drop=True).reset_index()
    print (df)
        A   B   C   Data 3  Data 1  Data 2
    0  a1  b1  c1       13       1       7
    1  a1  b1  c1       14       2       8
    2  a1  b1  c1       15       3       9
    3  a1  b2  c2       16       4      10
    4  a1  b2  c2       17       5      11
    5  a1  b2  c2       18       6      12
    

    列的顺序不同,因为样本数据中的 Data 3 有尾随空格 - ' Data 3'

    【讨论】:

      猜你喜欢
      • 2016-03-27
      • 2013-01-12
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 2021-05-19
      • 2015-10-18
      • 2021-09-04
      • 2017-10-17
      相关资源
      最近更新 更多