2016-02-27 4 views
3

Я использую панд для некоторой обработки данных, моя панда заявление выглядит следующим образомКак использовать группу по нескольким столбцам?

yearage.groupby(['year', 'Tm']).size() 

Это дает мне данные, как этот

2014 ATL  9 
     BOS  9 
     BRK  7 
     CHI 10 
     CHO  9 
     CLE  8 
     DAL  9 
     DEN  8 
     DET  9 
     GSW  8 

Когда я преобразовать его в dataframe, я получаю только две колонки соединения ключ и счетчик. То, что я на самом деле хочу, три колонки,

year, Tm, Size 

Как выделить два составные ключи после groupby?

+0

Как преобразовать в 'df'? По 'reset_index()'? – jezrael

+0

Это 'серия', которую вы можете преобразовать в' DataFrame' через 'reset_index()'. –

+0

Чтобы кратко рассказать о предыдущих комментариях, у вас есть MulitIndex, а не плоский индекс там b/c, сгруппированный по нескольким столбцам. reset_index просто возвращает вас к индексу '['year', 'tm']' to standard 'range (x)' index. – JohnE

ответ

3

Вы указываете as_index=False в своем заявлении groupby. В качестве побочного примечания вы, вероятно, хотите использовать count (который исключает NaN) вместо размера.

>>> df.groupby(['year', 'Tm'], as_index=False).count() 
    year Tm a 
0 2014 ATL 4 
1 2014 BOS 4 
2 2014 BRK 1 
3 2014 CHI 1 
4 2014 CHO 1 
5 2014 CLE 1 
6 2014 DAL 1 
7 2014 DEN 1 
8 2014 DET 1 
9 2014 GSW 1 

Для размера:

Другим простым примером агрегации является вычисление размера каждой группы. Это включено в GroupBy как метод размера. Он возвращает Серию, индексом которой являются имена групп и значения которых являются размерами каждой группы.

Для подсчета: кол

Compute группы, за исключением отсутствующих значений

+0

Я думал об этом же ответе, но пробовал, и он не работал для size(), и я не понимал, что это сработает для count(). Не знаете, почему поведение отличается от размера и количества? – JohnE

+0

Очень странно. Я получаю тот же результат, за исключением того, что он устанавливает 'year' и 'Tm' в качестве моего MultiIndex, когда я использую 'size' вместо' count'. – Alexander

2

Я думаю, вы можете попробовать reset_index с параметром name для нового имени столбца Size:

yearage.groupby(['year','Tm']).size().reset_index(name='Size') 

Пример:

print yearage 
    year Tm a 
0 2014 ATL 9 
1 2014 ATL 9 
2 2014 ATL 9 
3 2014 ATL 9 
4 2014 BOS 9 
5 2014 BRK 7 
6 2014 BOS 9 
7 2014 BOS 9 
8 2014 BOS 9 
9 2014 CHI 10 
10 2014 CHO 9 
11 2014 CLE 8 
12 2014 DAL 9 
13 2014 DEN 8 
14 2014 DET 9 
15 2014 GSW 8 

print yearage.groupby(['year','Tm']).size().reset_index(name='Size') 
    year Tm Size 
0 2014 ATL  4 
1 2014 BOS  4 
2 2014 BRK  1 
3 2014 CHI  1 
4 2014 CHO  1 
5 2014 CLE  1 
6 2014 DAL  1 
7 2014 DEN  1 
8 2014 DET  1 
9 2014 GSW  1 

Без параметра name получить новый столбец 0:

print yearage.groupby(['year','Tm']).size().reset_index() 
    year Tm 0 
0 2014 ATL 4 
1 2014 BOS 4 
2 2014 BRK 1 
3 2014 CHI 1 
4 2014 CHO 1 
5 2014 CLE 1 
6 2014 DAL 1 
7 2014 DEN 1 
8 2014 DET 1 
9 2014 GSW 1 
Смежные вопросы