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
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
我有如下形状的数据:
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
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