用另一列的值替换数据框子部分中的 1 个值

Replace 1 value in a subsection of dataframe with value of another column

我有一个单热编码数据帧,例如:

|  qtd|   a |   b |  c |   d |  e | ...z|
|-----+-----+-----|----|----+-----+-----|
|  90 |   1 |   0 |  0 |   0 |  0 |   0 |
|  10 |   0 |   0 |  0 |   0 |  0 |   1 |
|  40 |   0 |   1 |  0 |   0 |  0 |   0 |
|  80 |   0 |   0 |  1 |   0 |  0 |   0 |
|  90 |   0 |   1 |  0 |   0 |  0 |   0 |

我想用 qtd 中的值将 a 列的值替换为无穷大,其中该列的值是 1,[=12= 中只有一个 1 值] 到无限数据帧子帧。

如:

|  qtd|   a |   b |  c |   d |  e | ...z|
|-----+-----+-----|----|----+-----+-----|
|  90 |  90 |   0 |  0 |   0 |  0 |   0 |
|  10 |   0 |   0 |  0 |   0 |  0 |  10 |
|  40 |   0 |  40 |  0 |   0 |  0 |   0 |
|  80 |   0 |   0 | 80 |   0 |  0 |   0 |
|  90 |   0 |  90 |  0 |   0 |  0 |   0 |

您可以 select 所有列而不是第一个 DataFrame.iloc and multiple by column with DataFrame.mul:

df.iloc[:, 1:] = df.iloc[:, 1:].mul(df['qtd'], axis=0)
print (df)
   qtd   a   b   c  d  e   z
0   90  90   0   0  0  0   0
1   10   0   0   0  0  0  10
2   40   0  40   0  0  0   0
3   80   0   0  80  0  0   0
4   90   0  90   0  0  0   0

如果列并不总是第一个,则可以通过 Index.difference 和 select 通过子集获取列名称:

cols = df.columns.difference(['qtd'])
df[cols] = df[cols].mul(df['qtd'], axis=0)

如果第一列是索引:

df = df.mul(df.index, axis=0)
print (df)
      a   b   c  d  e   z
qtd                      
90   90   0   0  0  0   0
10    0   0   0  0  0  10
40    0  40   0  0  0   0
80    0   0  80  0  0   0
90    0  90   0  0  0   0

这里是numpy广播方式

df.values[:,1:]*=df.qtd[:,None]
df
Out[461]: 
   qtd   a   b   c  d  e   z
0   90  90   0   0  0  0   0
1   10   0   0   0  0  0  10
2   40   0  40   0  0  0   0
3   80   0   0  80  0  0   0
4   90   0  90   0  0  0   0