Python / Pandas Условное деление на несколько столбцов (пример кода) - PullRequest
0 голосов
/ 26 октября 2018

Имея DataFrame, подобный этому:

type  A  B  total
1     4  5   9
2     5  5  10
1     4  1  5

Возможно ли применить этот код:

df[['A','B']] = df[['A','B']].div(df['total'], axis=0)

НО на основе условия, что я имею в виду, применяет его только в случае типа== 1, оставляя другие значения (тип == 2) без изменений и не изменяя (подразделяя) фрейм данных в результате разделения?

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Вы можете использовать логическую маску; на самом деле, pd.DataFrame.mask работает здесь:

cond = df['type'].eq(1)

df[['A', 'B']] = df[['A', 'B']].mask(cond, df[['A','B']].div(df['total'], 0))

print(df)

   type         A         B  total
0     1  0.444444  0.555556      9
1     2  5.000000  5.000000     10
2     1  0.800000  0.200000      5
0 голосов
/ 26 октября 2018

Использование update

df.update(df.loc[df.type==1,['A','B']].div(df['total'], axis=0))
df
Out[417]: 
   type         A         B  total
0     1  0.444444  0.555556      9
1     2  5.000000  5.000000     10
2     1  0.800000  0.200000      5
0 голосов
/ 26 октября 2018

Я не уверен, что понимаю условие без изменения (подраздела) фрейма данных в результате деления , но я бы сделал это с помощью оператора loc, применяя деление только к строки с type == 1:

df.loc[df['type'].eq(1),['A','B']] = df[['A','B']].div(df['total'], axis=0)

Даю вам:

>>> df
   type         A         B  total
0     1  0.444444  0.555556      9
1     2  5.000000  5.000000     10
2     1  0.800000  0.200000      5

Где значения для type != 1 являются неизменными, за исключением того, что они являются числами с плавающей точкой, а не целыми числами (потому что эти столбцы имеют тип float после деления). Если это идет вразрез с вашим состоянием, сообщите мне об этом в комментариях, и я удалю или изменим этот ответ!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...