2016-02-08 8 views
13

ich meine Daten in Pandas Datenrahmen haben wie folgt:einzigartige Kombinationen von Werten in ausgewählten Spalten in Datenrahmen Pandas und zählen

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

Also, meine Daten wie diese, ich würde

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

sieht möchte es in einen anderen Datenrahmen umwandeln. Die erwartete Ausgabe kann in der folgenden Python-Skript angezeigt:

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

Also, meine erwartete Ausgabe sieht wie folgt aus

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

Eigentlich kann ich erreichen, alle Kombinationen zu finden, und sie zählen mit dem folgenden Befehl: mytable = df1.groupby(['A','B']).size()

Es stellt sich jedoch heraus, dass solche Kombinationen in einer einzigen Spalte sind. Ich möchte jeden Wert in einer Kombination in unterschiedliche Spalte trennen und auch eine weitere Spalte für das Ergebnis des Zählens hinzufügen. Ist es möglich, das zu tun? Darf ich Ihre Vorschläge haben? Vielen Dank im Voraus.

Antwort

26

Sie können groupby auf cols 'A' und 'B' und rufen size und dann reset_index und rename die generierte Spalte:

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 

Update

Eine kleine Erklärung, indem Sie auf die Gruppierung 2 Spalten, diese gruppiert Zeilen, wo A und B Werte gleich sind, rufen wir size, die die Anzahl der eindeutigen Gruppen zurückgibt:

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

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

So, jetzt die gruppierten Spalten wiederherzustellen, rufen wir 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 

Diese die Indizes wieder her, aber die Größe Aggregation in eine generierte Spalte 0 gedreht, so haben wir diese umbenennen:

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 akzeptiert die arg as_index, die wir auf False gesetzt haben könnte, so dass es nicht die gruppierten Spalten den Index macht, aber dies erzeugt eine series und Sie würden s bis die Indizes wiederhergestellt werden müssen und so weiter ....:

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. Vielen Dank. Es funktioniert perfekt. –

+1

Hey, kannst du erklären, wie diese Abfolge von Anrufen funktioniert? Sie haben einen Pandas-Datenrahmen, dann haben Sie die Größe, die Sie zurücksetzen, und so weiter? Einige Erklärung würde helfen: D – user2253546

+0

@ user2253546 siehe aktualisierte Antwort – EdChum

Verwandte Themen