Панды фрейма данных метода groupBy две колонки и получить отсчеты
у меня есть панда dataframe в следующем формате:
df = pd.DataFrame([[1.1, 1.1, 1.1, 2.6, 2.5, 3.4,2.6,2.6,3.4,3.4,2.6,1.1,1.1,3.3], list('AAABBBBABCBDDD'), [1.1, 1.7, 2.5, 2.6, 3.3, 3.8,4.0,4.2,4.3,4.5,4.6,4.7,4.7,4.8], ['x/y/z','x/y','x/y/z/n','x/u','x','x/u/v','x/y/z','x','x/u/v/b','-','x/y','x/y/z','x','x/u/v/w'],['1','3','3','2','4','2','5','3','6','3','5','1','1','1']]).T
df.columns = ['col1','col2','col3','col4','col5']
df:
col1 col2 col3 col4 col5
0 1.1 A 1.1 x/y/z 1
1 1.1 A 1.7 x/y 3
2 1.1 A 2.5 x/y/z/n 3
3 2.6 B 2.6 x/u 2
4 2.5 B 3.3 x 4
5 3.4 B 3.8 x/u/v 2
6 2.6 B 4 x/y/z 5
7 2.6 A 4.2 x 3
8 3.4 B 4.3 x/u/v/b 6
9 3.4 C 4.5 - 3
10 2.6 B 4.6 x/y 5
11 1.1 D 4.7 x/y/z 1
12 1.1 D 4.7 x 1
13 3.3 D 4.8 x/u/v/w 1
теперь я хочу сгруппировать это по двум столбцам следующим образом:
df.groupby(['col5','col2']).reset_index()
выход:
index col1 col2 col3 col4 col5
col5 col2
1 A 0 0 1.1 A 1.1 x/y/z 1
D 0 11 1.1 D 4.7 x/y/z 1
1 12 1.1 D 4.7 x 1
2 13 3.3 D 4.8 x/u/v/w 1
2 B 0 3 2.6 B 2.6 x/u 2
1 5 3.4 B 3.8 x/u/v 2
3 A 0 1 1.1 A 1.7 x/y 3
1 2 1.1 A 2.5 x/y/z/n 3
2 7 2.6 A 4.2 x 3
C 0 9 3.4 C 4.5 - 3
4 B 0 4 2.5 B 3.3 x 4
5 B 0 6 2.6 B 4 x/y/z 5
1 10 2.6 B 4.6 x/y 5
6 B 0 8 3.4 B 4.3 x/u/v/b 6
Я хочу получить счет по каждой строке, как показано ниже. Ожидаемый Результат:
col5 col2 count
1 A 1
D 3
2 B 2
etc...
как получить мой ожидаемый результат? И я хочу найти наибольшее количество для каждого значения "col2"?
6 ответов:
после ответа @Andy's, Вы можете сделать следующее, чтобы решить свой второй вопрос:
In [56]: df.groupby(['col5','col2']).size().reset_index().groupby('col2')[[0]].max() Out[56]: 0 col2 A 3 B 2 C 1 D 3
вы ищете
size:In [11]: df.groupby(['col5', 'col2']).size() Out[11]: col5 col2 1 A 1 D 3 2 B 2 3 A 3 C 1 4 B 1 5 B 2 6 B 1 dtype: int64
чтобы получить тот же ответ, что и waitingkuo ("второй вопрос"), но немного чище, нужно сгруппироваться по уровню:
In [12]: df.groupby(['col5', 'col2']).size().groupby(level=1).max() Out[12]: col2 A 3 B 2 C 1 D 3 dtype: int64
вставка данные в панды фрейма данных и предоставление имени столбца.
import pandas as pd df = pd.DataFrame([['A','C','A','B','C','A','B','B','A','A'], ['ONE','TWO','ONE','ONE','ONE','TWO','ONE','TWO','ONE','THREE']]).T df.columns = [['Alphabet','Words']] print(df) #printing dataframe.Это наши печатные данные:
для изготовления группа фреймов данных в панд и счетчик,
Вам нужно предоставить еще один столбец, который подсчитывает группировка, назовем этот столбец как,"счетчик" в таблице данных.Как это:
df['COUNTER'] =1 #initially, set that counter to 1. group_data = df.groupby(['Alphabet','Words'])['COUNTER'].sum() #sum function print(group_data)выход:
идиоматическое решение, которое использует только одну groupby
df.groupby(['col5', 'col2']).size() \ .sort_values(ascending=False) \ .reset_index(name='count') \ .drop_duplicates(subset='col2') col5 col2 count 0 3 A 3 1 1 D 3 2 5 B 2 6 3 C 1объяснение
результат groupby
sizeметод сериал сcol5иcol2в индекс. Отсюда вы можете использовать другой метод groupby, чтобы найти максимальное значение каждого значения вcol2но это не надо делать. Вы можете просто отсортировать все значения по убыванию, а затем сохранить только строки с первым вхождениемcol2Сdrop_duplicatesметод.

