我尝试将数据从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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。