使用多个groupby对pandas数据透视表进行操作

3
我有一个如下的pandas数据框:
df:
     item   day         time      data  
0   item_0  2012-12-02  00:00:01  0.81  
1   item_0  2012-12-02  00:00:02  0.07
2   item_0  2012-12-03  00:00:00  0.84  
3   item_1  2012-12-02  00:00:01  0.47

"物品+日期+时间的组合是唯一的。"
     item   day         time_0    time_1   time_2  
0   item_0  2012-12-02  NaN       0.81     0.07
1   item_0  2012-12-03  0.84      NaN      NaN  
2   item_1  2012-12-02  NaN       0.47     ... 

我已经尝试了:
df_stage_1 = df.groupby(['item','day']).apply(lambda x: x['time'].tolist()).reset_index()

上面的代码生成了一个列表,但时间不对齐从00:00:00开始 - 我可以检查列表并添加和跟踪索引(因此可以在这些索引处将NaN添加到值列表)。
df_stage_1 = pd.DataFrame(df_stage_1.tolist(), )

上面的代码给了我一个(未对齐的)时间值数据框,我可以将其对齐(参见上文),并附加到上一步创建的数据框中,但我无法弄清楚如何在正确的时间对齐列中获取数据框的值。
2个回答

5
您可以使用 pd.pivot_table 函数来完成此操作:
res = df.pivot_table(index=['item', 'day'], columns='time',
                     values='data', aggfunc='first').reset_index()

print(res)

time    item         day  00:00:00  00:00:01  00:00:02
0     item_0  2012-12-02       NaN      0.81      0.07
1     item_0  2012-12-03      0.84       NaN       NaN
2     item_1  2012-12-02       NaN      0.47       NaN

2

另一种解决方案是使用 set_indexunstackreset_index

df.set_index(['item', 'day', 'time'])['data'].unstack().reset_index()

time    item         day  00:00:00  00:00:01  00:00:02
0     item_0  2012-12-02       NaN      0.81      0.07
1     item_0  2012-12-03      0.84       NaN       NaN
2     item_1  2012-12-02       NaN      0.47       NaN

请记住,在 Pandas 中 df.unstack 是针对索引操作的,它会将最内层的索引逆转并转换为列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接