группировать столбец и считать элементы выше 5 в других пандах - PullRequest
0 голосов
/ 06 июня 2018

Итак, у меня есть df:

NAME    TRY SCORE  
Bob   1st   3  
Sue   1st   7  
Tom   1st   3  
Max   1st   8  
Jay   1st   4  
Mel   1st   7  
Bob   2nd   4  
Sue   2nd   2  
Tom   2nd   6  
Max   2nd   4  
Jay   2nd   7  
Mel   2nd   8  
Bob   3rd   3  
Sue   3rd   5  
Tom   3rd   6  
Max   3rd   3  
Jay   3rd   4  
Mel   3rd   6 

Я хочу посчитать, сколько раз каждый человек набирает больше 5?
, в новый df2, который выглядит так:

NAME    COUNT  
Bob     0  
Sue     1  
Tom     2  
Mary    1  
Jay     1  
Mel     3  

Моих попыток было много - вот последняя

df2 = df.groupby('NAME')[['SCORE'] > 5].count().reset_index(name="count")

Ответы [ 5 ]

0 голосов
/ 06 июня 2018

Сначала отфильтруйте фрейм данных, затем сгруппируйте с агрегацией и переиндексируйте, чтобы заполнить пропущенные значения.

df[df['SCORE'] > 5].groupby('NAME')['SCORE'].size()\
                   .reindex(df['NAME'].unique(), fill_value=0)

Вывод:

NAME
Bob    0
Sue    1
Tom    2
Max    1
Jay    1
Mel    3
Name: SCORE, dtype: int64
0 голосов
/ 06 июня 2018

Если вы хотите считать в качестве словаря, вы можете использовать collections.Counter:

from collections import Counter

c = Counter(df.loc[df['SCORE'] > 5, 'NAME'])

Для фрейма данных вы можете сопоставить счетчики с уникальными именами:

res = pd.DataFrame({'NAME': df['NAME'].unique(), 'COUNT': 0})

res['COUNT'] = res['NAME'].map(c).fillna(0).astype(int)

print(res)

   COUNT NAME
0      0  Bob
1      1  Sue
2      2  Tom
3      1  Max
4      1  Jay
5      3  Mel
0 голосов
/ 06 июня 2018

Просто используя groupby и sum

df.assign(SCORE=df.SCORE.gt(5)).groupby('NAME')['SCORE'].sum().astype(int).reset_index()
Out[524]: 
  NAME  SCORE
0  Bob      0
1  Jay      1
2  Max      1
3  Mel      3
4  Sue      1
5  Tom      2

Или мы используем set_index с sum

df.set_index('NAME').SCORE.gt(5).sum(level=0).astype(int)
0 голосов
/ 06 июня 2018

Один из способов сделать это - написать пользовательскую групповую функцию, в которой вы берете оценки каждой группы и суммируете те, которые больше 5, например:

df.groupby('NAME')['SCORE'].agg(lambda x: (x > 5).sum())


NAME
Bob    0
Jay    1
Max    1
Mel    3
Sue    1
Tom    2
Name: SCORE, dtype: int64
0 голосов
/ 06 июня 2018

Сначала создайте логическую маску, а затем значения aggregate by sum - True s будут такими процессами, как 1:

df2 = (df['SCORE'] > 5).groupby(df['NAME']).sum().astype(int).reset_index(name="count")
print (df2)
  NAME  count
0  Bob      0
1  Jay      1
2  Max      1
3  Mel      3
4  Sue      1
5  Tom      2

Detail :

print (df['SCORE'] > 5)

0     False
1      True
2     False
3      True
4     False
5      True
6     False
7     False
8      True
9     False
10     True
11     True
12    False
13    False
14     True
15    False
16    False
17     True
Name: SCORE, dtype: bool
...