Как выполнить несколько группировок и преобразований с условием в pandas - PullRequest
2 голосов
/ 11 июля 2020

Это расширение вопроса здесь: здесь

Я пытаюсь добавить дополнительный столбец в grouby:

# Import pandas library 
import pandas as pd
import numpy as np

# data
data = [['tom', 10,2,'c',100,'x'], ['tom',16 ,3,'a',100,'x'], ['tom', 22,2,'a',100,'x'],
        ['matt', 10,1,'c',100,'x'], ['matt', 15,5,'b',100,'x'], ['matt', 14,1,'b',100,'x']]

# Create the pandas DataFrame 
df = pd.DataFrame(data, columns = ['Name', 'Attempts','Score','Category','Rating','Other'])
df['AttemptsbyRating'] = df.groupby(by=['Rating','Other'])['Attempts'].transform('count')
df

введите описание изображения здесь

Затем я пытаюсь добавить еще один столбец для суммы строк, у которых оценка больше 1 (что должно равняться 4):

df['scoregreaterthan1'] = df['Score'].gt(1).groupby(by=df[['Rating','Other']]).transform('sum')

Но я получаю

ValueError: Grouper for '<class 'pandas.core.frame.DataFrame'>' not 1-dimensional

Есть идеи? большое спасибо!

1 Ответ

3 голосов
/ 11 июля 2020

df['Score'].gt(1) возвращает логический ряд, а не фрейм данных. Вам необходимо сначала вернуть фрейм данных, прежде чем вы сможете группировать по соответствующим столбцам.

используйте:

df = df[df['Score'].gt(1)]
df['scoregreaterthan1'] = df.groupby(['Rating','Other'])['Score'].transform('count')
df

output:

    Name    Attempts    Score   Category    Rating  Other   AttemptsbyRating    scoregreaterthan1
0   tom     10          2       c           100     x       6                4
1   tom     16          3       a           100     x       6                4
2   tom     22          2       a           100     x       6                4
4   matt    15          5       b           100     x       6                4

Если вы хотите, чтобы люди у кого оценка не больше единицы, то вместо этого:

df = df[df['Score'].gt(1)]
df['scoregreaterthan1'] = df.groupby(['Rating','Other'])['Score'].transform('count')

сделайте следующее:

df['scoregreaterthan1'] = df[df['Score'].gt(1)].groupby(['Rating','Other'])['Score'].transform('count')
df['scoregreaterthan1'] = df['scoregreaterthan1'].ffill().astype(int)

вывод 2:

    Name    Attempts    Score   Category    Rating  Other   AttemptsbyRating    scoregreaterthan1
0   tom     10  2   c   100 x   6   4
1   tom     16  3   a   100 x   6   4
2   tom     22  2   a   100 x   6   4
3   matt    10  1   c   100 x   6   4
4   matt    15  5   b   100 x   6   4
5   matt    14  1   b   100 x   6   4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...