2016-02-08 8 views
13

Ho i miei dati nei data frame panda come segue:combinazioni uniche di valori in colonne selezionate in data frame panda e contare

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']}) 

Quindi, miei dati assomiglia a questo

---------------------------- 
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 
----------------------------- 

lo farei piace trasformarlo in un altro frame di dati. Il risultato atteso può essere illustrato nel seguente script python:

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

Quindi, la mia uscita prevista è simile al seguente

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

In realtà, posso ottenere per trovare tutte le combinazioni e le considero utilizzando la seguente comando: mytable = df1.groupby(['A','B']).size()

Tuttavia, risulta che tali combinazioni si trovano in una singola colonna. Vorrei separare ogni valore in una combinazione in una colonna diversa e aggiungere anche un'altra colonna per il risultato del conteggio. è possibile farlo? Posso avere i tuoi suggerimenti? Grazie in anticipo.

risposta

26

È possibile groupby su cols 'A' e 'B' e chiamare size e poi reset_index e rename colonna generato:

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 

aggiornamento

Una piccola spiegazione, raggruppando sul 2 colonne, questo raggruppa le righe dove i valori A e B sono uguali, chiamiamo size che restituisce il numero di gruppi univoci:

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

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

Così ora per ripristinare le colonne raggruppate, chiamiamo 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 

Questo ripristina gli indici ma l'aggregazione dimensione è trasformato in una colonna generata 0, quindi dobbiamo rinominare questo:

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 

groupby accetta l'arg as_index che avremmo potuto impostare su False quindi non rende le colonne raggruppate l'indice, ma questo genera un series e tu dovresti fino a dover ripristinare gli indici e così via ....:

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. Grazie mille. Funziona perfettamente. –

+1

Ehi, puoi spiegare come funziona questa sequenza di chiamate? Hai una cornice dati panda e hai le dimensioni su cui resisti reset_index e così via? Qualche spiegazione potrebbe aiutare: D – user2253546

+0

@ user2253546 vedi risposta aggiornata – EdChum

Problemi correlati