Заменить 1 значение в подразделе dataframe значением другого столбца - PullRequest
1 голос
/ 12 апреля 2019

У меня есть один горячий кодированный кадр данных, например:

|  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 |

Я хочу заменить значения столбцов a на бесконечное значением в qtd, где столбец имеет значение 1 в качестве значения, в подкадре a для бесконечного фрейма данных есть только одно значение 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 |

Ответы [ 2 ]

3 голосов
/ 12 апреля 2019

Вы можете выбрать все столбцы без первого с помощью DataFrame.iloc и умножить на столбец с помощью 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 и выбрать по подмножеству:

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
1 голос
/ 12 апреля 2019

Вот 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
...