Есть ли способ сделать пользовательскую функцию в функции агрегации pandas? - PullRequest
1 голос
/ 24 марта 2020

Хотите применить пользовательскую функцию в Dataframe, например. Dataframe

    index City  Age 
0   1    A    50    
1   2    A    24    
2   3    B    65    
3   4    A    40     
4   5    B    68    
5   6    B    48    

Функция для применения

def count_people_above_60(age):
     **    ***                       #i dont know if the age can or can't be passed as series or list to perform any operation later
     return count_people_above_60 

, ожидающая выполнения чего-то вроде

df.groupby(['City']).agg{"AGE" : ["mean",""count_people_above_60"]}

Ожидается. Output

City  Mean People_Above_60
 A    38    0
 B    60.33    2

1 Ответ

2 голосов
/ 24 марта 2020

Если важна производительность, создайте новый столбец, заполненный сравниваемыми значениями, конвертированными в integer с, поэтому для подсчета используется агрегация sum:

df = (df.assign(new = df['Age'].gt(60).astype(int))
        .groupby(['City'])
        .agg(Mean= ("Age" , "mean"), People_Above_60= ('new',"sum")))
print (df)
           Mean  People_Above_60
City                            
A     38.000000                0
B     60.333333                2

Ваше решение должно быть изменено с помощью сравниваемых значений и sum, но медленно, если много групп или больших DataFrame:

def count_people_above_60(age):
    return (age > 60).sum()

df = (df.groupby(['City']).agg(Mean=("Age" , "mean"), 
                               People_Above_60=('Age',count_people_above_60)))
print (df)
           Mean  People_Above_60
City                            
A     38.000000                0
B     60.333333                2
...