2014-11-25 2 views
0

У меня есть следующие DataFrame:группа по панд в DataFrame

 email cat class_price 
0 [email protected] cat1   1 
1 [email protected] cat2   2 
2 [email protected] cat2   4 
3 [email protected] cat2   4 
4 [email protected] cat2   1 
5 [email protected] cat1   3 
6 [email protected] cat1   2 
7 [email protected] cat2   1 
8 [email protected] cat2   4 
9 [email protected] cat2   2 
10 [email protected] cat3   1 
11 [email protected] cat1   1 

И я хочу, чтобы группы по электронной почте и по class_price, для каждой строки я хочу взять максимум из class_price.

Я использую:

test_df2 = test_df.groupby(['email','cat'])['class_price'].max() 

Выход:

email    cat 
[email protected] cat1 2 
        cat2 4 
[email protected] cat2 2 
        cat3 1 
[email protected] cat1 3 
        cat2 4 

Но как я могу получить результат, похожий на SQL группе по? то есть:

email    cat1 cat2 cat3 
[email protected] 2  4  0 
[email protected] 0  2  1 
[email protected] 3  4  0 
+0

[Это не очень важно, но ваш примерный вывод несовместим с вашим примером ввода - нет 'cat3'. Несколько секунд озадачил меня.] – DSM

+0

true, я редактирую @DSM – woshitom

ответ

3

Использование unstack('cat'), а затем fillna(0) заменить нули пренебрежимы малый:

In [311]: test_df.groupby(['email','cat'])['class_price'].max().unstack('cat').fillna(0) 
Out[311]: 
cat    cat1 cat2 cat3 
email        
[email protected]  2  4  0 
[email protected]  0  2  1 
[email protected]  3  4  0 

stack перемещает значение уровня столбцов для значений уровня индекса.

unstack перемещает значения уровней индекса до значений уровня столбца. Поэтому, когда вы видите, что у вас есть индексный уровень cat, и вы хотите, чтобы значения cat находились на уровне столбца, вы можете быстро узнать, что необходимо для операции разблокировки.

Смежные вопросы