转置或枢转Pandas中的多列

时间:2018-08-26 04:44:23

标签: python pandas pivot transpose

我想在一个数据框中转置多列。我浏览了大多数有关转置和枢轴的熊猫文章,但无法使其正常工作。

这是我的数据框的样子。

df = pd.DataFrame()
df['L0'] = ['fruit', 'fruit', 'fruit', 'fruit', 'fruit', 'fruit', 'vegetable', 'vegetable', 'vegetable', 'vegetable', 'vegetable', 'vegetable']
df['L1'] = ['apple', 'apple', 'apple', 'banana', 'banana', 'banana', 'tomato', 'tomato', 'tomato', 'lettuce', 'lettuce', 'lettuce']
df['Type'] = ['X', 'Y', 'Z', 'X', 'Y', 'Z', 'X', 'Y', 'Z', 'X', 'Y', 'Z']
df['A'] = [3, 0, 4, 3, 1, 3, 2, 2, 2, 4, 2, 4]
df['B'] = [3, 1, 0, 4, 1, 4, 4, 4, 2, 1, 2, 1]
df['C'] = [0, 4, 1, 0, 2, 4, 1, 1, 2, 3, 2, 3]

我想转置/旋转A,B和C列,并用“类型”列中的值替换它们。结果数据框应如下所示。

df2 = pd.DataFrame()
df2['L0'] = ['fruit', 'fruit', 'fruit', 'fruit', 'fruit', 'fruit', 'vegetable', 'vegetable', 'vegetable', 'vegetable', 'vegetable', 'vegetable']
df2['L1'] = ['apple', 'apple', 'apple', 'banana', 'banana', 'banana', 'tomato', 'tomato', 'tomato', 'lettuce', 'lettuce', 'lettuce']
df2['Type2'] = ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C']
df2['X'] = [3, 3, 0, 3, 4, 0, 2, 4, 1, 4, 1, 3]
df2['Y'] = [0, 1, 4, 1, 1, 2, 2, 4, 1, 2, 2, 2]
df2['Z'] = [4, 0, 1, 3, 4, 4, 2, 2, 2, 4, 1, 3]

我能做的最好的是

df.groupby(['L0', 'L1', 'Type'])['A', 'B', 'C'].sum().unstack('Type')

但这不是我真正想要的。谢谢!

1 个答案:

答案 0 :(得分:2)

unstack之前添加stack

df = (df.groupby(['L0', 'L1', 'Type'])['A', 'B', 'C']
        .sum()
        .stack()
        .unstack('Type')
        .reset_index()
        .rename_axis(None, axis=1)
        .rename(columns={'level_2':'Type2'}))
print (df)
           L0       L1 Type2  X  Y  Z
0       fruit    apple     A  3  0  4
1       fruit    apple     B  3  1  0
2       fruit    apple     C  0  4  1
3       fruit   banana     A  3  1  3
4       fruit   banana     B  4  1  4
5       fruit   banana     C  0  2  4
6   vegetable  lettuce     A  4  2  4
7   vegetable  lettuce     B  1  2  1
8   vegetable  lettuce     C  3  2  3
9   vegetable   tomato     A  2  2  2
10  vegetable   tomato     B  4  4  2
11  vegetable   tomato     C  1  1  2