Как написать функцию агрегирования в Pandas с условием на другой столбец - PullRequest
0 голосов
/ 21 мая 2018

Предположим, что кадр данных df со столбцами a, b, c, d.Я знаю способ определения функции для агрегирования значений в Panda, например:

def my_agg(x):
    names = {
        'a_Total': x['a'].sum(), 
        'b_Mean': x['b'].mean()
     }
    return pd.Series(names, index=['a_Total','b_Mean'])

d_aggregate = df.groupby(['c','d']).apply(my_agg)

То, что я ищу, - это способ подсчета итоговых значений или средних значений a, b соответственно на основе выборочных значений в столбце 'c'или' d '.

Пример данных:

df=pd.DataFrame({"a":[10,20,30,40],
             "b":[1,2,3,4],
             "c":[c1,c1,c1,c2],
             "d":[100,200,300,400]})

Моя агрегатная функция:

def my_agg91(x):
names = {
    'Sum_a': x['a'].sum(),   
    'Mean_b': x['b'].mean()}

return pd.Series(names, index=['Sum_a','Mean_b'])

df2= df.groupby(['c']).apply(my_agg91)

, которая дает мне:

    Sum_a  Mean_b
c                
c1   60.0     2.0
c2   40.0     4.0

Что я хочу: Сумма «a» для «d» <250 и среднее значение «b» для «d»> 250 (в одном кадре данных), пожалуйста, предложите изменения в функции для получения вывода:

    Sum_a  Mean_b
c                
c1   30.0     3.0
c2    0.0     4.0

1 Ответ

0 голосов
/ 21 мая 2018

Фильтр в соответствии с вашей функцией, например:

def my_agg92(x):
   names = {
       'Sum_a': x[x['d'] < 250]['a'].sum(),   
       'Mean_b': x[x['d'] > 250]['b'].mean()}

   return pd.Series(names, index=['Sum_a','Mean_b'])

df.groupby(['c']).apply(my_agg92)
...