2016-06-16 29 views
1

我有一张用户表,他们每天花费多少钱。我想将它们重新排列成每个用户只有一行,并且列中显示他们每天花费的金额。将多个大熊猫行组合成不同标题的单个记录

user_id day spending 

111  mon  15 
111  tues  20 
111  weds  25 
.... 
122  mon  44 
122  tues  34 
122  weds  90 
122  thurs  26 
.... 

我想表折叠成形式

id  mon tues weds thurs fri sat sun  

111 15 20 25 16 48 32 40 
122 44 34 90 26 20 22 53 

眼下这个代码初始化日常列(星期一,星期二,结婚...等)为全零,然后它把for循环中每个列的每日支出数据,除了当天的支出应该为零,这会导致对角矩阵查找表。然后,我总结了整个事情,以获得单行记录中填写的所有值。眼下这个代码工作在一个小数据集,但for循环花费很长的时间对我的完整数据集:

for i,hr in zip(np.arange(len(df)),df['day']): 
    df.ix[i,hr]=df1_subset.ix[i,"spending"] 
# aggregate the users by id and dates 
df = df.groupby('id').sum() 

什么是我可以多用一些大熊猫,适当的操作,我可以避开的方式为循环或使这个更快?

谢谢。

回答

2
df.pivot(index='user_id', columns='day').fillna(0) 
Out[50]: 
     spending     
day   mon thurs tues weds 
user_id       
111   15  0 20 25 
122   44 26 34 90 

或者,如果你想定制的聚合功能,使用pivot_table

table = pd.pivot_table(df, index='user_id', columns='day', aggfunc=np.sum) 

table 
Out[53]: 
     spending     
day   mon thurs tues weds 
user_id       
111   15 NaN 20 25 
122   44 26 34 90 
1

您可以使用DataFrame.pivot来实现此目的。如果存储表在一个名为DF则数据帧中的代码将

Table = df.pivot(index='userid',columns='day',values='spending')