我有一张这样的桌子:
person_id item_id time value_1 cat_1
1 34545 2009-11-15 18:08:00 6.5 cm
1 34546 2009-11-15 18:08:00 5.2 met
1 49996 2009-11-15 18:08:00 4.5 abc
2 34545 2008-12-19 09:55:00 nan xyz
2 34546 2008-12-19 09:55:00 8.9 abc
3 49996 2009-06-15 14:04:00 3.4 cm
3 34545 2009-06-15 14:04:00 3.6 met
3 34546 2009-04-23 23:05:00 99.1 xyz
每个人在特定时间都有一些item
被执行。因此,我想获取item_id
假人,而不是其中的0和1值。我想拥有value_1
和cat_1
的价值。
仅在person_id
和time
相同的情况下执行假人
在上面的示例中,我具有以下唯一的item_id
:
所以我想创建以下列:
34545_value_1
,34545_cat_1
,34546_value_1
,34546_cat_1
,49996_value_1
,49996_cat_1
预期输出:
person_id item_id time 34545_value_1 34545_cat_1 34546_value_1 34546_cat_1 49996_value_1 49996_cat_1`
1 34545 2009-11-15 18:08:00 6.5 cm 5.2 met 4.5 abc
2 34545 2008-12-19 09:55:00 nan xyz 8.9 abc nan nan
3 49996 2009-06-15 14:04:00 3.6 met nan nan 3.4 cm
3 34546 2009-04-23 23:05:00 nan nan 99.1 xyz nan nan
编辑:仅在person_id和时间相同的情况下执行虚拟操作
答案 0 :(得分:1)
使用:
new_df = ( df.pivot_table(index = ['person_id','time'],
columns = ['item_id'],
values = ['value_1','cat_1','item_id'],aggfunc = 'first')
)
new_df.columns = [f'{y}_{x}' for x,y in new_df.columns]
new_df = (df.groupby(['person_id','time'])
.item_id.first()
.to_frame()
.join(new_df)
.reset_index())
print(new_df)
person_id time item_id 34545_cat_1 34546_cat_1 49996_cat_1 \
0 1 2009-11-15 18:08:00 34545 cm met abc
1 2 2008-12-19 09:55:00 34545 xyz abc NaN
2 3 2009-04-23 23:05:00 34546 NaN xyz NaN
3 3 2009-06-15 14:04:00 49996 met NaN cm
34545_value_1 34546_value_1 49996_value_1
0 6.5 5.2 4.5
1 NaN 8.9 NaN
2 NaN 99.1 NaN
3 3.6 NaN 3.4