Pandas - 在groupby之后将列转换为新行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pandas - 在groupby之后将列转换为新行相关的知识,希望对你有一定的参考价值。

我有一个熊猫数据帧。我需要将一些列转换为行。数据帧在前3列中每3行具有相同的数据。因此,我将需要6个列,您将在我预期的数据框中看到。我有以下数据帧:

shopCode    Product   Code  Score
    111      Apple    123    0.70
    111      Apple    456    0.75
    111      Apple    789    0.80
    222      Orange   142    0.66
    222      Orange   136    0.83
    222      Orange   623    0.76

我预期的数据框是:

shopCode  Product   Code1 Code2 Code3 Score1 Score2 Score3
  111      Apple     123   456   789   0.70   0.75   0.80
  222      Orange    142   136   623   0.66   0.83   0.76

我试图使用df.pivot(index=['shopCode', 'Product'], columns=['Code1', 'Code2', 'Code3', 'Score1', 'Score2', 'Score3'], values=['Code', 'Score'])但它不起作用。

答案

我们使用pivot_table

df=pd.pivot_table(df,index=['shopCode','Product'],columns=df.groupby(['shopCode','Product']).cumcount().add(1),values=['Code','Score'],aggfunc='sum')
df.columns=df.columns.map('{0[0]}{0[1]}'.format) 
df
Out[112]: 
                  Code1  Code2  Code3  Score1  Score2  Score3
shopCode Product                                             
111      Apple      123    456    789    0.70    0.75    0.80
222      Orange     142    136    623    0.66    0.83    0.76

reset_index之后

df.reset_index()
Out[113]: 
   shopCode Product  Code1  Code2  Code3  Score1  Score2  Score3
0       111   Apple    123    456    789    0.70    0.75    0.80
1       222  Orange    142    136    623    0.66    0.83    0.76
另一答案

可以用pandas groupby和字典合并来实现。

df.groupby(['shopCode', 'Product']).apply(lambda x: pd.Series(
                               {
                                **{'Code'+str(i+1): t for i,t in enumerate(x.Code)},
                                **{'Score'+str(i+1): t for i,t in enumerate(x.Score)}
                               }
                             )).reset_index()

以上是关于Pandas - 在groupby之后将列转换为新行的主要内容,如果未能解决你的问题,请参考以下文章

将列中的字符串集列表转换为新列

如何将 pandas 列中的 JSON 数据转换为新列

Pandas:将列转换为唯一列表

Pandas 规范化字典列表

将列转换为时间戳 - Pandas Dataframe

使用 Pandas 将列转换为行