【发布时间】:2022-01-03 10:27:41
【问题描述】:
我有一个如下定义的数据框:
cols = pd.MultiIndex.from_tuples([("unnamed_0", "b"), ("unnamed_1", "c"),('total','A'),('total','B'),('total','C')])
df = pd.DataFrame([[1,2,3,4,5], [3,4,5,6,7],[5,6,8,9,10],[7,8,11,12,13],[9,19,13,24,25]], columns=cols)
df
这是:
unnamed_0 unnamed_1 total
b c A B C
0 1 2 3 4 5
1 3 4 5 6 7
2 5 6 8 9 10
3 7 8 11 12 13
4 9 19 13 24 25
我想要的是将此数据框转换为:
d = {'b': [1, 1,1,3,3,3,5,5,5,7,7,7,9,9,9], 'c': [2,2,2,4,4,4,6,6,6,8,8,8,19,19,19],'total':[3,4,5,5,6,7,8,9,10,11,12,13,13,24,25],'type':['A','B','C','A','B','C','A','B','C','A','B','C','A','B','C']}
df2 = pd.DataFrame(d)
print(df2)
即:
b c total type
0 1 2 3 A
1 1 2 4 B
2 1 2 5 C
3 3 4 5 A
4 3 4 6 B
5 3 4 7 C
6 5 6 8 A
7 5 6 9 B
8 5 6 10 C
9 7 8 11 A
10 7 8 12 B
11 7 8 13 C
12 9 19 13 A
13 9 19 24 B
14 9 19 25 C
我最初尝试使用删除两个 unnamed_ 列
df = df.xs(["unnamed_0","unnamed_1"], axis=1, drop_level=True)
但这并不顺利,因为除了我想要的之外,它丢弃了所有东西。至于将 2 级标题转换为列值,我想到了使用类似 df.T.unstack().reset_index(level=1, name='type').rename(columns={'level_1':'A'})[['type','A']] 的东西,如本例所示:
df=pd.DataFrame(index=['x','y'], data={'a':[1,2],'b':[3,4]})
a b
x 1 3
y 2 4
df.T.unstack().reset_index(level=1, name='c1').rename(columns={'level_1':'c2'})[['c1','c2']]
c1 c2
x 1 a
x 3 b
y 2 a
y 4 b
但我没有设法将其应用于多级标题数据帧。
任何帮助将不胜感激。
【问题讨论】:
标签: python-3.x pandas dataframe