虽然我认为我可以天真烂漫地做到这一点,但我有兴趣学习一种更优雅,更有效的方法。
给出以下数据框:
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
列中的值转换为列标题本身,从而完全丢弃flavor
和points
。因此最终结果将如下所示:
In [44]: pd.DataFrame({'goober':[42,31], 'tronic':[55,101]}, index=['foo','bar'])
Out[44]:
goober tronic
foo 42 55
bar 31 101
谢谢您的建议。
答案 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_index
与Series.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在评论中指出的那样。