2013-08-29 2 views
21

Вот упрощенный пример моего ДФА:панда dataframe создавать новые столбцы и заполнить с расчетными значениями из тех же ФРА

ds = pd.DataFrame(np.abs(randn(3, 4)), index=[1,2,3], columns=['A','B','C','D']) 
ds 
     A   B   C   D 
1 1.099679 0.042043 0.083903 0.410128 
2 0.268205 0.718933 1.459374 0.758887 
3 0.680566 0.538655 0.038236 1.169403 

Я хотел бы суммировать данные в столбцах грести мудры:

ds['sum']=ds.sum(axis=1) 
ds 
     A   B   C   D  sum 
1 0.095389 0.556978 1.646888 1.959295 4.258550 
2 1.076190 2.668270 0.825116 1.477040 6.046616 
3 0.245034 1.066285 0.967124 0.791606 3.070049 

Теперь вот мой вопрос! Я хотел бы создать 4 новых столбца и вычислить процентное значение из общей суммы (суммы) в каждой строке. Поэтому первое значение в первом новом столбце должно быть (0.095389/4.258550), первое значение во втором новом столбце (0,556978/4.258550) ... и так далее ... Помогите пожалуйста

ответ

37

Вы можете сделать это легко вручную для каждого столбца, как это:

df['A_perc'] = df['A']/df['sum'] 

Если вы хотите сделать это за один шаг для всех столбцов, вы можете использовать метод div (http://pandas.pydata.org/pandas-docs/stable/basics.html#matching-broadcasting-behavior):

ds.div(ds['sum'], axis=0) 

А если вы хотите, чтобы это в одном шаге добавляется к тому же dataframe:

>>> ds.join(ds.div(ds['sum'], axis=0), rsuffix='_perc') 
      A   B   C   D  sum A_perc B_perc \ 
1 0.151722 0.935917 1.033526 0.941962 3.063127 0.049532 0.305543 
2 0.033761 1.087302 1.110695 1.401260 3.633017 0.009293 0.299283 
3 0.761368 0.484268 0.026837 1.276130 2.548603 0.298739 0.190013 

    C_perc D_perc sum_perc 
1 0.337409 0.307517   1 
2 0.305722 0.385701   1 
3 0.010530 0.500718   1 
+0

Спасибо !! Только то, что я хотел – jonas

+1

Выполняя что-то подобное, гарантируют ли панды гарантировать, что порядок строк не изменится? – kalu

+0

Да, порядок строк определенно сохраняется. – joris

2
In [56]: df = pd.DataFrame(np.abs(randn(3, 4)), index=[1,2,3], columns=['A','B','C','D']) 

In [57]: df.divide(df.sum(axis=1), axis=0) 
Out[57]: 
      A   B   C   D 
1 0.319124 0.296653 0.138206 0.246017 
2 0.376994 0.326481 0.230464 0.066062 
3 0.036134 0.192954 0.430341 0.340571 
+1

Для ясности 'div' и' divide' одинаковы (просто псевдонимы) – joris

 Смежные вопросы

  • Нет связанных вопросов^_^