2016-02-08 9 views
13

mam danych w ramce danych Pandy następująco:unikatowe kombinacje wartości w wybranych kolumnach w ramce danych Pandy i liczyć

df1 = pd.DataFrame({'A':['yes','yes','yes','yes','no','no','yes','yes','yes','no'], 
        'B':['yes','no','no','no','yes','yes','no','yes','yes','no']}) 

Więc moje dane wygląda to

---------------------------- 
index   A  B 
0   yes  yes 
1   yes  no 
2   yes  no 
3   yes  no 
4   no  yes 
5   no  yes 
6   yes  no 
7   yes  yes 
8   yes  yes 
9   no  no 
----------------------------- 

bym jak przekształcić go w inną ramkę danych. Oczekiwany wynik można przedstawić w następujący skrypt Pythona:

output = pd.DataFrame({'A':['no','no','yes','yes'],'B':['no','yes','no','yes'],'count':[1,2,4,3]}) 

Tak, mój oczekiwany wynik wygląda tak

-------------------------------------------- 
index  A  B  count 
-------------------------------------------- 
0   no  no  1 
1   no  yes  2 
2  yes  no  4 
3  yes  yes  3 
-------------------------------------------- 

Właściwie mogę osiągnąć, aby znaleźć wszystkie kombinacje i policzyć je za pomocą następujących command: mytable = df1.groupby(['A','B']).size()

Jednak okazuje się, że takie kombinacje są w jednej kolumnie. Chciałbym oddzielić każdą wartość w kombinacji na inną kolumnę, a także dodać jeszcze jedną kolumnę dla wyniku zliczania. czy jest to możliwe do zrobienia? Czy mogę otrzymać Twoje sugestie? Z góry dziękuję.

Odpowiedz

26

Można groupby na Cols 'A' i 'B' i nazywają size a następnie reset_index i rename wygenerowany kolumna:

In [26]: 

df1.groupby(['A','B']).size().reset_index().rename(columns={0:'count'}) 
Out[26]: 
    A B count 
0 no no  1 
1 no yes  2 
2 yes no  4 
3 yes yes  3 

aktualizacja

Trochę wyjaśnienie, grupując na 2 kolumny, to grupuje wiersze, w których wartości A i B są takie same, nazywamy size, która zwraca liczbę unikalnych grup:

In[202]: 
df1.groupby(['A','B']).size() 

Out[202]: 
A B 
no no  1 
    yes 2 
yes no  4 
    yes 3 
dtype: int64 

Więc teraz, aby przywrócić zgrupowane kolumn, nazywamy reset_index:

In[203]: 
df1.groupby(['A','B']).size().reset_index() 

Out[203]: 
    A B 0 
0 no no 1 
1 no yes 2 
2 yes no 4 
3 yes yes 3 

To przywraca indeksy ale agregacja rozmiar jest przekształcony w wygenerowanym kolumnie 0, więc musimy zmienić nazwę to:

In[204]: 
df1.groupby(['A','B']).size().reset_index().rename(columns={0:'count'}) 

Out[204]: 
    A B count 
0 no no  1 
1 no yes  2 
2 yes no  4 
3 yes yes  3 

akceptuje arg as_index, który moglibyśmy ustawić na False, więc nie powoduje, że zgrupowane kolumny są indeksem, ale generuje to series, a Ty możesz do czasu przywrócenia indeksów i tak dalej ...:

In[205]: 
df1.groupby(['A','B'], as_index=False).size() 

Out[205]: 
A B 
no no  1 
    yes 2 
yes no  4 
    yes 3 
dtype: int64 
+0

Oh. Dziękuję Ci bardzo. Działa idealnie. –

+1

Hej, możesz wyjaśnić, jak działa ta sekwencja połączeń? Masz ramkę danych o pandach, a następnie masz rozmiar, na którym resetujesz index i tak dalej? Kilka wyjaśnień może pomóc: D – user2253546

+0

@ user2253546 zobacz zaktualizowaną odpowiedź – EdChum

Powiązane problemy