将二进制列中的值替换为另一列中的值

gor*_*jan 10 python dataframe pandas

我有一个如下所示的数据框:

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
Run Code Online (Sandbox Code Playgroud)

基本上我想要做的是将一个热编码元素的值替换为"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
Run Code Online (Sandbox Code Playgroud)

cs9*_*s95 14

为什么不繁殖?

df.pop('value').values * df

   item1  item2  item3
0      0      5      0
1      4      0      0
2      0      0      3
Run Code Online (Sandbox Code Playgroud)

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


如果"item_*"列中除了1之外还有其他内容,那么您可以使用bool:

df.pop('value').values * df.astype(bool)

   item1  item2  item3
0      0      5      0
1      4      0      0
2      0      0      3
Run Code Online (Sandbox Code Playgroud)

如果您的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
Run Code Online (Sandbox Code Playgroud)

  • 迄今为止最优雅的答案 (4认同)