具有自定义值权重的熊猫中的虚拟编码

时间:2019-02-11 19:00:42

标签: python pandas dummy-variable

我的数据形状如下:


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,但是该方法仅计算“项目”列中的观察值数量,而没有考虑得分值。

2 个答案:

答案 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)

您可以使用set_index + unstack

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