以特定方式重塑熊猫数据框第 3 部分

Reshape panda dataframe in a specific way Part 3

我有以下table

import pandas as pd

data = {'ID': [123, 123,124,124,125], 'Method': ['angular', 'square','angular','square','square'], 'Colour': ['red', 'blue','red','blue','blue'], 'Result': ['20', '30','10','5','13'] }

df = pd.DataFrame (data, columns = ['ID','Method','Colour','Result'])
df


ID  Method  Colour  Result
123 angular red       20
123 square  blue      30
124 angular red       10
124 square  blue       5
125 square  blue       13

所以,我想以通用方式转换此 table,以便我可以得到。此 table 可以包含更多条目,但我只显示其中的一个片段。

ID  Method_angular_red Method_square_blue 

123         20              30
124         10              5
125                         13

我知道我们可以使用 unstack 等,但我对此没有信心,因为我是 python 的新手。感谢您的帮助。

你好,我有第二个用例:

假设我现在有更多列,例如:

import pandas as pd

data = {'ID': [123, 123,124,124,125], 'Text': ['A', 'A','B','B','C'],'flag': [0, 0,1,1,2],'Method': ['angular', 'square','angular','square','square'], 'Colour': ['red', 'blue','red','blue','blue'], 'Result': ['20', '30','10','5','13'] }

df = pd.DataFrame (data, columns = ['ID','Text','flag','Method','Colour','Result'])
df



ID  Text flag   Method  Colour  Result
123   A    0     angular    red       20
123   A    0      square    blue      30
124   B    1     angular    red       10
124   B    1      square    blue       5
125   C    2      square    blue       13

我想要一个 flexibel 脚本来对第一列(可能是 N 列)进行分组或聚合,然后像

那样旋转其他列
ID    Text flag  Method_angular_red Method_square_blue 

123     A    0          20              30
124     B    1          10              5
125     C    2                          13

我尝试使用以下代码,但出现错误:

m = df.assign(Method=df['Method'].add('_'+df['Colour'])).drop('Colour',1)
out = m.pivot(*m).add_prefix('Method_').rename_axis(None,axis=1).reset_index()
out

您可以在添加 2 列后尝试 df.pivot

m = df.assign(Method=df['Method'].add('_'+df['Colour'])).drop('Colour',1)
out = m.pivot(*m).add_prefix('Method_').rename_axis(None,axis=1).reset_index()
#or out = (m.pivot_table('Result','ID','Method',aggfunc=sum).rename_axis(None,axis=1)
#          .add_prefix('Method_').reset_index())

    ID Method_angular_red Method_square_blue
0  123                 20                 30
1  124                 10                  5
2  125                NaN                 13