Вычислите среднее значение из подмножества строк во фрейме данных панд: групповое или для цикла - PullRequest
0 голосов
/ 18 февраля 2019

Скажем, у меня есть фрейм данных, который дает число Fruit в двух чашах A и B, которое выглядит так:

df = pd.DataFrame({'Fruit':['apple','apple','pear','pear','banana','banana'],
'Bowl': ['A','B','A','B','A','B'],
'Value':[15, 20, 332, 240, 344, 211]}); df

    Fruit   Bowl    Value
    apple   A       15
    apple   B       20
    pear    A       332
    pear    B       240
    banana  A       311
    banana  B       211

И у меня есть общее количество фруктовв чашах "A" и "B".

num = pd.DataFrame({'Bowl': ['A','B'], 'Num': [330, 200]}); num

    Num   Type
    330   A
    200   B

Какой элегантный способ получить процентное соотношение (пропорция * 100, Prop) фруктов внутри каждого типа в каждой чаше, используя num?

    Fruit   Bowl    Value  Prop
    apple   A       15     4.55  
    apple   B       20     ...
    pear    A       332    
    pear    B       240    
    banana  A       45    
    banana  B       27    

Таким образом, расчет в Prop является, например, (количество яблок в миске A (15), деленное на общее количество фруктов в миске A (330) * 100 = 4,55.)

** Обратите внимание, что общее количество фруктов не является суммой яблоко + груша + банан в миске «А».Вы должны использовать числа, указанные в num, потому что на самом деле в чаше больше фруктов.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

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

df.set_index('Bowl').Value.div(num.set_index('Bowl').Num)*100
Out[72]: 
Bowl
A      4.545455
A    100.606061
A    104.242424
B     10.000000
B    120.000000
B    105.500000
dtype: float64
#df['Prop']=df.set_index('Bowl').Value.div(num.set_index('Bowl').Num)*100.values
0 голосов
/ 18 февраля 2019

Один из способов добиться этого - сначала «слить» столбец num с вашим основным значением и затем вычислить пропорции, подобные этой:

# first merge
df_final = pd.merge(df, num, on='Bowl')

# calculate the proportion
df_final['Prop'] = round(df_final.Value / df_final.Num * 100, 2) 

# drop the column Num which was not asked in the output
df_final.drop('Num', axis=1, inplace=True)

    Fruit   Bowl    Value   Prop
0   apple   A       15      3.53
1   pear    A       332     78.12
2   banana  A       344     80.94
3   apple   B       20      6.35
4   pear    B       240     76.19
5   banana  B       211     66.98
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...