我的数据形状如下:
pd.DataFrame({'id': [1,2,3], 'item': ['item_a', 'item_a', 'item_b'],
'score': [1,-1,1]})
id item score
1 item_a 1
2 item_a -1
3 item_b 1
我想为项目列获取伪代码,但我希望它们根据得分列中的值进行得分。如果没有观察结果,我希望将其归为0。像这样:
id item_a item_b
1 1 0
2 -1 0
3 0 1
如您所见,我想捕获用户ID 1喜欢item_a,ID 2不喜欢item_a,并且用户3没有与item_a交互。 id列不是每行唯一的-例如,用户id 3可能会喜欢item_a,并将其记录为原始数据框中的新行。
我尝试在熊猫中使用get_dummies,但是该方法仅计算“项目”列中的观察值数量,而没有考虑得分值。
答案 0 :(得分:3)
您想要的是pivot_table
:
df.pivot_table(values='score', index='id', columns='item', fill_value=0)
#item item_a item_b
#id
#1 1 0
#2 -1 0
#3 0 1
答案 1 :(得分:1)
import pandas as pd
df = pd.DataFrame({'id': [1,2,3], 'item': ['item_a', 'item_a', 'item_b'],
'score': [1,-1,1]})
print(df.set_index(['id', 'item'])['score'].unstack(fill_value=0))
输出
item item_a item_b
id
1 1 0
2 -1 0
3 0 1
如果要完全匹配您的输出,只需添加以下行:
result.columns.name = None
result.reset_index(inplace=True)
输出
id item_a item_b
0 1 1 0
1 2 -1 0
2 3 0 1