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

Dummy coding in pandas with custom value weights

我有如下形状的数据:


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,并且将在原始数据框中记录为新行。

我试过在pandas中使用get_dummies,但该方法只计算"item"列中观测值的数量,没有考虑分数值。

你要的是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

您可以使用 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