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

2024-04-20 07:43:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数据如下:


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

我想为item列获取伪代码,但我想根据它们在score列中的值对它们进行评分。如果没有观察到,我要一个0插补。像这样:

id  item_a  item_b
1      1      0
2     -1      0
3      0      1

如您所见,我想捕获用户id 1喜欢项a,id 2不喜欢项a,并且用户3没有与项a交互。id列在每行中不是唯一的-例如,用户id 3可能喜欢项a,而这将记录为原始数据帧中的新行。你知道吗

我试过在pandas中使用get\ dummies,但是这种方法只计算“item”列中观察到的值的数量,没有考虑分数值。你知道吗


Tags: 数据方法代码用户iddataframepandasget
2条回答

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

你想要的是^{}

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

相关问题 更多 >