разделение выбранных столбцов в пандах - PullRequest
0 голосов
/ 27 октября 2018

Это фрейм данных:

bins  year  binA  binB  binC  binD  binE  binF  binG  binH
0     1998   4.0   5.0   1.0   1.0   2.0   0.0   1.0   0.0
1     1999   4.0   2.0   1.0   0.0   0.0   4.0   1.0   2.0
2     2000   4.0   1.0   1.0   0.0   4.0   1.0   1.0   2.0
3     2001   2.0   1.0   4.0   1.0   1.0   0.0   2.0   3.0

Моя цель - поделить binA до binH на сумму binA:binH или для строки 1998, разделить на сумму строки, исключая годчисло.

Сумма нужных столбцов: newdfdd.loc[:,'binA':'binH'].sum(axis=1)

Чтобы получить желаемое значение, я попробовал вот что:

newdfdd[['binA','binB','binC','binD','binE',
         'binF','binG' ,'binH']].div(newdfdd.loc[:,'binA':'binH'].sum(axis=1))

Но я получаю NaNи четыре дополнительных столбца следующим образом:

0   1   2   3   binA   binB binC binD binE binF binG binH
0   NaN NaN NaN NaN    NaN  NaN NaN NaN NaN NaN NaN NaN
1   NaN NaN NaN NaN    NaN  NaN NaN NaN NaN NaN NaN NaN
2   NaN NaN NaN NaN    NaN  NaN NaN NaN NaN NaN NaN NaN
3   NaN NaN NaN NaN    NaN  NaN NaN NaN NaN NaN NaN NaN

Я хочу получить результаты в следующем формате:

bins  year   binA  binB  binC  binD  binE  binF  binG  binH
0     1998   0.285 0.357  ...   ....  ....  ....  ...  ...        
1     1999   ..   ..   ..   ..   ..   ..   ..   ..

.... означает некоторое число из расчета.

Что мне нужно отредактировать в моем коде для желаемого вывода?

Ответы [ 2 ]

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

В выражении div необходимо указать axis='index', и он должен получить искомый результат.

Так что ваш код выше должен выглядеть так:

newdfdd.update(newdfdd.loc[:,'binA':'binH'].div(newdfdd.loc[:,'binA':'binH'].sum(axis=1), 
                                                axis='index'))

Это вычислит ваш процент суммы строки по желанию, а затем обновит значения на месте в newfdd фрейме данных.

Вот полное моё решение для ясности (я использовал df и случайные величины, но остальное то же самое):

df = pd.DataFrame({'bins':[0,1,2,3],
              'year':[1998,1999,2000,2001],
              'binA':np.random.randint(1,10,4),
              'binB':np.random.randint(1,10,4),
              'binC':np.random.randint(1,10,4),
              'binD':np.random.randint(1,10,4),
              'binE':np.random.randint(1,10,4),
              'binF':np.random.randint(1,10,4),
              'binG':np.random.randint(1,10,4),
              'binH':np.random.randint(1,10,4)})

#reodering columns to match your dataframe layout
df = df[['bins','year','binA','binB','binC','binD','binE',
     'binF','binG' ,'binH']]

df.update(df.loc[:,'binA':'binH'].div(df.loc[:,'binA':'binH'].sum(axis=1),axis='index'))

print(df)

   bins year    binA        binB        binC        binD        binE    binF    binG    binH
0   0   1998    0.222222    0.037037    0.148148    0.185185    0.037037    0.111111    0.037037    0.222222
1   1   1999    0.264706    0.058824    0.205882    0.058824    0.029412    0.147059    0.176471    0.058824
2   2   2000    0.166667    0.041667    0.145833    0.020833    0.166667    0.166667    0.145833    0.145833
3   3   2001    0.062500    0.187500    0.020833    0.145833    0.083333    0.166667    0.166667    0.166667
0 голосов
/ 27 октября 2018

Я думаю, что это результат, который вы ищете:

df['rowSum'] = df[df.columns[2:]].apply(sum, axis=1)
df[df.columns[2:]].apply(lambda x: (x / x['rowSum']), axis=1).drop(columns=['rowSum'])

        binA        binB        binC        binD        binE       binF     binG        binH
0   0.285714    0.357143    0.071429    0.071429    0.142857    0.000000    0.071429    0.000000
1   0.285714    0.142857    0.071429    0.000000    0.000000    0.285714    0.071429    0.142857
2   0.285714    0.071429    0.071429    0.000000    0.285714    0.071429    0.071429    0.142857
3   0.142857    0.071429    0.285714    0.071429    0.071429    0.000000    0.142857    0.214286
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...