2015-07-22 13 views
21

którym podano dataframe który loguje zastosowania niektórych książek tak:Jak GroupBy się Dataframe w Pand i zachować Kolumny

Name Type ID 
Book1 ebook 1 
Book2 paper 2 
Book3 paper 3 
Book1 ebook 1 
Book2 paper 2 

muszę się liczyć z wszystkich książek, prowadzenie innych kolumn i otrzymaj :

Name Type ID Count 
Book1 ebook 1  2 
Book2 paper 2  2 
Book3 paper 3  1 

Jak można tego dokonać?

Dzięki!

+1

Kiedy mówisz "zdobyć liczbę wszystkich książek", co dokładnie mówisz. Czy chcesz liczyć według nazwy, typu, ID lub ich kombinacji? W jaki sposób wyniki wyglądałyby, gdyby Book1 również miał typ "papierowy"? – Alexander

+0

Chcę liczyć wszystkie książki po imieniu, a nazwa i typ są zawsze spójne: Book1 zawsze będzie ebookiem. –

Odpowiedz

20

Chcesz następujące:

In [20]: 
df.groupby(['Name','Type','ID']).count().reset_index() 

Out[20]: 
    Name Type ID Count 
0 Book1 ebook 1  2 
1 Book2 paper 2  2 
2 Book3 paper 3  1 

W twoim przypadku „Nazwa”, „Typ” i „ID” cols mecz w wartościach więc możemy groupby na nich, a następnie zadzwonić countreset_index.

Alternatywnym rozwiązaniem byłoby dodanie „count” kolumny stosując transform a następnie zadzwonić drop_duplicates:

In [25]: 
df['Count'] = df.groupby(['Name'])['ID'].transform('count') 
df.drop_duplicates() 

Out[25]: 
    Name Type ID Count 
0 Book1 ebook 1  2 
1 Book2 paper 2  2 
2 Book3 paper 3  1 
+0

To zwraca mi pustą ramkę danych – Geeocode

+1

To wydaje się działać, ale gdybyśmy mieli o wiele więcej kolumn (jak mam w innych ramkach danych), czy nie zaszkodziłoby to wydajności? Ponadto nie jest bardzo intuicyjny. –

+0

Problem polega na tym, że grupowanie zmniejszy ilość informacji, więc niekoniecznie da pożądany df za jednym zamachem, zaktualizowałem moją odpowiedź, aby pokazać, jak można to zrobić w 2 krokach, co jest lepsze do zrozumienia. – EdChum

10

myślę as_index = False powinno załatwić sprawę.

Powiązane problemy