用另一列的值替换二进制列中的值



我有一个数据帧,看起来像这样:

df = pd.DataFrame({"value": [4, 5, 3], "item1": [0, 1, 0], "item2": [1, 0, 0], "item3": [0, 0, 1]})
df
value item1   item2   item3
0   4   0      1         0
1   5   1      0         0
2   3   0      0         1

基本上,我想做的是用"value"列中的值替换一个热编码元素的值,然后删除"value"栏。生成的数据帧应该是这样的:

df_out = pd.DataFrame({"item1": [0, 5, 0], "item2": [4, 0, 0], "item3": [0, 0, 3]})
item1    item2   item3
0   0        4      0
1   5        0      0
2   0        0      3

为什么不直接相乘?

df.pop('value').values * df
item1  item2  item3
0      0      5      0
1      4      0      0
2      0      0      3

DataFrame.pop具有就地移除和返回列的良好效果,因此您可以在一个步骤中完成此操作。


如果"item_*"列中除了1之外还有其他内容,则可以与bools:相乘

df.pop('value').values * df.astype(bool)
item1  item2  item3
0      0      5      0
1      4      0      0
2      0      0      3

如果您的DataFrame有其他列,请执行以下操作:

df
value  name  item1  item2  item3
0      4  John      0      1      0
1      5  Mike      1      0      0
2      3  Stan      0      0      1
# cols = df.columns[df.columns.str.startswith('item')]
cols = df.filter(like='item').columns
df[cols] = df.pop('value').values * df[cols]
df
name  item1  item2  item3
0  John      0      5      0
1  Mike      4      0      0
2  Stan      0      0      3

您可以执行以下操作:

df = pd.DataFrame([df['value']*df['item1'],df['value']*df['item2'],df['value']*df['item3']])
df.columns = ['item1','item2','item3']

编辑:由于这个答案不能很好地扩展到@coldspeed注释的许多列,因此应该迭代一个循环:

cols = ['item1','item2','item3']
for c in cols:
df[c] *= df['value']
df.drop('value',axis=1,inplace=True)

您需要:

col = ['item1','item2','item3']
for c in col:
df[c] = df[c] * df['value']
df.drop(['value'],1,inplace=True)

pd.DataFrame.mul

您可以使用mul或等效的multiply,使用标签或整数位置索引:

# label-based indexing
res = df.filter(regex='^item').mul(df['value'], axis='index')
# integer positional indexing
res = df.iloc[:, 1:].mul(df.iloc[:, 0], axis='index')
print(res)
#    item1  item2  item3
# 0      0      4      0
# 1      5      0      0
# 2      0      0      3

最新更新