我有一个熊猫数据框,其数据如下:
df:
cf push CloudConsoleApp --health-check-type none -s windows2016 -b binary_buildpack --no-route -c 'my_app.exe'
item + day + time的组合是唯一的
我正在尝试转换为:
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 ...
上面的代码产生一个列表,但是时间从00:00:00开始不对齐-我可以检查列表并添加和跟踪索引(因此可以在这些索引处将Nan添加到值列表中)
df_stage_1 = df.groupby(['item','day']).apply(lambda x: x['time'].tolist()).reset_index()
上面的代码为我提供了一个(未对齐的)时间值的数据框,我可以将其对齐(请参见上文)并追加到在上述步骤中创建的数据框,但是我无法解决如何在正确的时间对齐列中获取该数据框的值
答案 0 :(得分:2)
您可以使用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
答案 1 :(得分:2)
另一个解决方案是set_index
,unstack
,reset_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
请记住,df.unstack
在熊猫中是指索引:它会取消堆栈索引的最内层并将其旋转到列中。