熊猫数据框groupby索引并将行值转换为列

时间:2020-10-21 08:38:35

标签: python python-3.x pandas dataframe

虽然我认为我可以天真烂漫地做到这一点,但我有兴趣学习一种更优雅,更有效的方法。

给出以下数据框:

In [42]: df = pd.DataFrame({'flavor':['goober','tronic','goober','tronic'], 'points':[42,55,31,101]}, index=['foo','foo','bar','bar'])

In [43]: df
Out[43]: 
     flavor  points
foo  goober      42
foo  tronic      55
bar  goober      31
bar  tronic     101

我想对索引进行分组,并将flavor列中的值转换为列标题本身,从而完全丢弃flavorpoints。因此最终结果将如下所示:

In [44]: pd.DataFrame({'goober':[42,31], 'tronic':[55,101]}, index=['foo','bar'])
Out[44]: 
     goober  tronic
foo      42      55
bar      31     101

谢谢您的建议。

2 个答案:

答案 0 :(得分:2)

首先使用DataFrame.pivot并将索引转换为列,然后使用DataFrame.rename_axis删除索引和列名:

df = df.reset_index().pivot('index', 'flavor','points').rename_axis(index=None,columns=None)
print (df)
     goober  tronic
bar      31     101
foo      42      55

或将DataFrame.set_indexSeries.unstack一起使用:

df = (df.set_index('flavor', append=True)['points']
        .unstack()
        .rename_axis(index=None, columns=None))
print (df)
     goober  tronic
bar      31     101
foo      42      55

答案 1 :(得分:1)

您可以使用pandas.pivot_table

print( pd.pivot_table(df, index=df.index, columns='flavor', values='points') )

打印:

flavor  goober  tronic
bar         31     101
foo         42      55

注意:如果不需要aggfunc,请改用.pivot()。正如@jezrael在评论中指出的那样。