2016-09-08 2 views
-1

Как рассчитать процент группы в пандах?Pandas groupwise percent

похоже на Pandas: .groupby().size() and percentages или Pandas Very Simple Percent of total size from Group by Я хочу рассчитать процентное соотношение стоимости каждой группы.

Как я могу это достичь?

Мой набор данных структурирована как

ClassLabel, Field 

Первоначально я агрегировать на обоих ClassLbel и Field как

grouped = mydf.groupby(['Field', 'ClassLabel']).size().reset_index() 
grouped = grouped.rename(columns={0: 'customersCountPerGroup'}) 

Теперь я хотел бы знать, какой процент клиентов в каждой группе на каждую группу основа. Общее количество групп может быть получено как mydf.groupby(['Field']).size(), но я не могу объединить это как столбец, и я уверен, что это правильный подход - должно быть что-то более простое.

редактировать

Я хочу, чтобы вычислить процент, основываясь только на одной группе, например, 3 0 0,125 1 0,250 сумма 0 + 1 -> 0,125 + 0,250 = 0,375 и использовать это значение для разделим/нормализуют группироваться и не grouped.sum() enter image description here

ответ

4

IIUC вы можете использовать:

mydf = pd.DataFrame({'Field':[1,1,3,3,3], 
        'ClassLabel':[4,4,4,4,4], 
        'A':[7,8,9,5,7]}) 

print (mydf) 
    A ClassLabel Field 
0 7   4  1 
1 8   4  1 
2 9   4  3 
3 5   4  3 
4 7   4  3 

grouped = mydf.groupby(['Field', 'ClassLabel']).size() 
print (grouped) 
Field ClassLabel 
1  4    2 
3  4    3 
dtype: int64 

print (100 * grouped/grouped.sum()) 
Field ClassLabel 
1  4    40.0 
3  4    60.0 
dtype: float64 

grouped = mydf.groupby(['Field', 'ClassLabel']).size().reset_index() 
grouped = grouped.rename(columns={0: 'customersCountPerGroup'}) 
print (grouped) 
    Field ClassLabel customersCountPerGroup 
0  1   4      2 
1  3   4      3 

grouped['per'] = 100 * grouped.customersCountPerGroup/grouped.customersCountPerGroup.sum() 
print (grouped) 
    Field ClassLabel customersCountPerGroup per 
0  1   4      2 40.0 
1  3   4      3 60.0 

EDIT замечанием:

mydf = pd.DataFrame({'Field':[1,1,3,3,3,4,5,6], 
        'ClassLabel':[0,0,0,1,1,0,0,6], 
        'A':[7,8,9,5,7,5,6,4]}) 

print (mydf) 

grouped = mydf.groupby(['Field', 'ClassLabel']).size() 
df = grouped/grouped.sum() 

df = (grouped/df.groupby(level=0).transform('sum')).reset_index(name='new') 
print (df) 
    Field ClassLabel  new 
0  1   0 8.000000 
1  3   0 2.666667 
2  3   1 5.333333 
3  4   0 8.000000 
4  5   0 8.000000 
5  6   6 8.000000 
+0

но если я не хочу использовать 'grouped.sum()', но на самом деле выполнить эту OPERAT ион для каждой группы отдельно, например. используйте сумму класса 0 и класс 1 для поля 1 в качестве общего. Как я могу получить к нему доступ? –

+0

Извините, вы можете добавить его в вопрос, какой желаемый результат ввода? лучше всего изменить или использовать мой образец или создать еще один, потому что я не уверен, что я вас понимаю. – jezrael

+0

см. Редактирование. –