2015-07-17 3 views
2
    country_name country_code val_code \ 
    United States of America   231      1 
    United States of America   231      2 
    United States of America   231      3 
    United States of America   231      4 
    United States of America   231      5 

     y191  y192  y193  y194  y195 \ 
    47052179 43361966 42736682 43196916 41751928 
    1187385 1201557 1172941 1176366 1192173 
    28211467 27668273 29742374 27543836 28104317 
    179000 193000 233338 276639 249688 
    12613922 12864425 13240395 14106139 15642337 

В фрейме данных, приведенном выше, я хотел бы вычислить для каждой строки процентное отношение общего числа, занятого этим val_code, в результате чего получается значение foll. кадр данных.Вычислить процент для каждой строки в pandas dataframe

I.e. Сложите каждую строку и разделить на сумму всех строк

    country_name country_code val_code \ 
    United States of America   231      1 
    United States of America   231      2 
    United States of America   231      3 
    United States of America   231      4 
    United States of America   231      5 

     perc 
    50.14947129 
    1.363631254 
    32.48344744 
    0.260213146 
    15.74323688 

Прямо сейчас, я это делаю, но это не работает

grp_df = df.groupby(['country_name', 'val_code']).agg() 

pct_df = grp_df.groupby(level=0).apply(lambda x: 100*x/float(x.sum())) 

ответ

2

Ge общая для всех столбцов, представляющих интерес, а затем добавить процент колонки:.

In [35]: 
total = np.sum(df.ix[:,'y191':].values) 
df['percent'] = df.ix[:,'y191':].sum(axis=1)/total * 100 
df 

Out[35]: 
       country_name country_code val_code  y191  y192 \ 
0 United States of America   231   1 47052179 43361966 
1 United States of America   231   1 1187385 1201557 
2 United States of America   231   1 28211467 27668273 
3 United States of America   231   1 179000 193000 
4 United States of America   231   1 12613922 12864425 

     y193  y194  y195 percent 
0 42736682 43196916 41751928 50.149471 
1 1172941 1176366 1192173 1.363631 
2 29742374 27543836 28104317 32.483447 
3 233338 276639 249688 0.260213 
4 13240395 14106139 15642337 15.743237 

Так np.sum будет суммировать все значения:

In [32]: 
total = np.sum(df.ix[:,'y191':].values) 
total 

Out[32]: 
434899243 

Затем мы вызываем .sum(axis=1)/total * 100 на интересующие вас суммы, чтобы суммировать поровну, разделите их на общую сумму и умножьте на 100, чтобы получить процент.

10

Вы можете получить процент каждого столбца, используя lambda функцию следующим образом:

>>> df.iloc[:, 3:].apply(lambda x: x/x.sum()) 
     y191  y192  y193  y194  y195 
0 0.527231 0.508411 0.490517 0.500544 0.480236 
1 0.013305 0.014088 0.013463 0.013631 0.013713 
2 0.316116 0.324405 0.341373 0.319164 0.323259 
3 0.002006 0.002263 0.002678 0.003206 0.002872 
4 0.141342 0.150833 0.151969 0.163455 0.179920 

Ваш пример не имеет одинаковые значения для val_code, так что я не уверен, как вы хотите, чтобы ваши данные появляются (т.е. показать процент от общего в Colum п по сравнению с общим для каждого v val_code группы)

+0

как использовать ту же технику для x/x.sum (axis = 1) (то есть процент от общего количества строк). Благодарю. Мне нужно это для какой-то другой задачи. – ihightower

+0

@ihightower Звучит как новый вопрос ... – Alexander

+0

wow, который был быстрым. на самом деле я просто решил проблему из других сообщений .. df.apply (lambda x: x/x.sum(), axis = 1) (просто нужно добавить ось = 1 для применения). в любом случае, спасибо вам большое. Ваш ответ на этот вопрос был причиной того, что я хотел. ранее я пытался использовать параметр оси = 1 в неправильном положении. – ihightower

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