Pandas сгруппировать несколько столбцов, чтобы получить среднее значение для другого столбца в зависимости от условия - PullRequest
1 голос
/ 25 марта 2020

Я застрял на этом, и подобные посты создают для меня что-то вроде черной дыры. Я все еще учусь ..

Я хотел бы взять среднее значение группы, которая удовлетворяет условию. Мои данные выглядят так:

user          date           Flag    Value  
0    ron  12/23/2016        'flag'    10     
1    ron  12/21/2016        'n/a'     25     
2    ron   12/23/2016       'flag'    10     
3    ron  12/21/2016        'n/a'     3      
4   andy   12/22/2016       'flag'    5      
5   andy   12/22/2016       'flag'    1      

Я бы хотел сгруппировать пользователя + Flag и создать новый столбец «Avg», который принимает только значения Avg «flag». Таким образом, данные будут выглядеть так:

user          date           Flag    Value  Avg
0    ron  12/23/2016        'flag'    10     10
1    ron  12/21/2016        'n/a'     25     10
2    ron   12/23/2016       'flag'    10     10
3    ron  12/21/2016        'n/a'     3      10
4   andy   12/22/2016       'flag'    5      3
5   andy   12/22/2016       'flag'    1      3

У меня есть что-то подобное, но я пробовал много разных вариантов:

groups = sample.groupby(['user','Flag'])
flag = sample.groupby(['user','Flag'])['Value'].transform('mean')
sample.loc[:,'Avg'] = np.select([flag.eq('flag'), groups.transform('mean')])

Руководство ценится ..

1 Ответ

1 голос
/ 25 марта 2020

Вот решение с groupby и map:

df['Avg'] = df['user'].map(df[df['Flag']=="'flag'"]            # use "flag" only if you don't have `'` in the data'
                             .groupby('user')['Value'].mean())

Вывод:

   user        date    Flag  Value  Avg
0   ron  12/23/2016  'flag'     10   10
1   ron  12/21/2016   'n/a'     25   10
2   ron  12/23/2016  'flag'     10   10
3   ron  12/21/2016   'n/a'      3   10
4  andy  12/22/2016  'flag'      5    3
5  andy  12/22/2016  'flag'      1    3
...