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之后将列转换为新行的主要内容,如果未能解决你的问题,请参考以下文章