2017-06-05 77 views
1

我有GROUPBY()在大熊猫Python的大熊猫 - 据帧GROUPBY和重新构建

一个问题,如果我有一个数据帧“DF”

user day click 
0 U1 Mon 15 
1 U2 Mon 7 
2 U1 Wed 15 
3 U3 Tue 21 
4 U2 Tue 15 
5 U2 Tue 10 

当我使用DF。 GROUPBY([ '用户', '日'])。总和()
这将是

  click 
user day 
U1 Mon 15 
     Tue NaN 
     Wed 15 
U2 Mon 7 
     Tue 25 
     Wed NaN 
U3 Mon NaN 
     Tue 21 
     Wed NaN 

如何获得这样的数据帧

day Mon Tue Wed 
user 
U1  15 NaN 15 
U2  7  25 NaN 
U3  NaN 21 NaN 

这意味着将一列转换为DataFrame的列名称。
有没有方法做到这一点?同一天,列

回答

3

使用旋转功能,并点击填写。

df.groupby(['user', 'day']).sum().reset_index()\ 
    .pivot(index='user',columns='day',values='click') 
Out[388]: 
day Mon Tue Wed 
user     
U1 15.0 NaN 15.0 
U2  7.0 25.0 NaN 
U3  NaN 21.0 NaN 

或者你也可以仅重置第二级指标,这样你就不需要在旋转功能,以指定索引列。

df.groupby(['user', 'day']).sum().reset_index(level=1)\ 
.pivot(columns='day',values='click') 
+0

谢谢! pivot()方法解决了这个问题。 –

+0

不客气。很高兴它有帮助。 – Allen

2

只是另一种方式使用拆散():

df=df.groupby(['user', 'day']).sum().unstack('day') #unstack 
df.columns = df.columns.droplevel() # drop first level column name 
df 

输出:

day Mon Tue Wed 
user    
U1 15.0 NaN 15.0 
U2 7.0 25.0 NaN 
U3 NaN 21.0 NaN 
+0

这似乎在列索引中生成另一个级别。 – Allen

+0

@Allen你是对的,你的解决方案是更好的方法:) upvoted –

+0

在我的应用程序中,我会使用pivot()。这也是一个很好的解决方案。感谢您的帮助 –