我尝试将数据从Excel导入到Pandas,但是我在重新排列Meatadata时遇到问题。
Excel工作表的格式(此处简化):原始数据
但我想将Excel工作表导入到Pandas数据框,然后以这种格式重新排列,以简化Pandas中的统计图绘制:最终数据
我尝试了以下方法,但无法获得正确的格式:
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文件原始数据
问题来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
使用链接数据进行测试-添加index_col = 0将第一列转换为索引,然后通过DataFrame.reset_index和drop = 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.unstack,Series.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
 
列的顺序不同,因为样本数据中的“数据3”具有尾随空格-“数据3”
回答来源:stackoverflow