2017-01-31 3 views
4

Das ist mein Datenrahmen:Wie kann die Anzahl der Einträge pro Gruppe gezählt werden?

df = 

GROUP GRADE TOTAL_SERVICE_TIME TOTAL_WAIT_TIME 
AAA  1  45     20 
AAA  4  40     23 
AAA  5  35     21 
BBB  2  30     24 
BBB  3  55     22 

ich Gruppeneinträge will von GROU und GRADE, schätzt TOTAL_SERVICE_TIME bedeuten und bedeuten TOTAL_WAIT_TIME, sowie die Anzahl der Einträge, die jede Gruppe für jede Gruppierung zählen gehören.

Ich weiß nicht, wie das Zählen auszuführen:

output = df.groupby(['GROUP','GRADE']) 
      .agg({'TOTAL_SERVICE_TIME' : 'mean', 'TOTAL_WAIT_TIME' : 'mean'}) 
      .value_counts() 
      .reset_index() 

Ich habe auch versucht , 'COUNT' : 'count' hinzuzufügen, aber die Spalte COUNT sollte bereits vorhanden sein.

+0

'df.groupby ([ 'GROUP', 'GRADE']) agg ({ 'TOTAL _SERVICE_TIME ': [' mean ',' count '],' TOTAL_WAIT_TIME ': [' mean ',' count ']}) '- addiere count zu agg? – Zero

+0

@JohnGalt: Danke, aber es erzeugt zwei identische Unterspalten. Ich brauche einen namens "COUNT". – Dinosaurius

Antwort

2

Sie sind in der Nähe, und die Dokumentation ist Licht auf agg:

df.groupby(['GROUP','GRADE']).agg({'TOTAL_SERVICE_TIME' : 'mean', 
            'TOTAL_WAIT_TIME' : ['mean', 'count']}) 
Out[45]: 
      TOTAL_WAIT_TIME  TOTAL_SERVICE_TIME 
         mean count    mean 
GROUP GRADE           
AAA 1     20  1     45 
     4     23  1     40 
     5     21  1     35 
BBB 2     24  1     30 
     3     22  1     55 
+0

Danke, aber ist es möglich, 'count' in eine separate Spalte namens' COUNT' zu setzen, nicht als Unterspalte von 'TOTAL_WAIT_TIME'? – Dinosaurius

+0

Ich meine, dass das Zählen auf der Ebene von 'GROUP' und' GRADE' erfolgen sollte, ohne sich um 'TOTAL_WAIT_TIME' zu kümmern. – Dinosaurius

+0

Das ist genau das, was passiert: Das Zählen wirkt sich nicht auf die Spalte aus, in der Sie es für eine bestimmte Gruppierung verarbeiten, da es nicht vom Inhalt der Spalte abhängt. Ich habe eins von ihnen per Konvention abgeholt, du kannst das andere aufheben, wenn du willst: es ist egal und gibt dir die erwartete Anzahl. Je nach Level kannst du deine Spalte einfach neu indizieren, um nur eine Ebene zu erhalten. – Boud

1

Ich mag würde this great @Boud's answer mit einem anderen Beispiel erweitern, in dem Sie benutzerdefinierte Spaltennamen geben können:

In [57]: funcs = { 
    ...: 'TOTAL_SERVICE_TIME': {'mean_service':'mean', 'count_service':'size'}, 
    ...: 'TOTAL_WAIT_TIME' : {'mean_wait':'mean', 'count_wait':'size'} 
    ...: } 
    ...: 

In [58]: df 
Out[58]: 
    GROUP GRADE TOTAL_SERVICE_TIME TOTAL_WAIT_TIME 
0 AAA  1     45    20 
1 AAA  1     100    100 
2 AAA  4     40    23 
3 AAA  5     35    21 
4 BBB  2     30    24 
5 BBB  3     55    22 

In [59]: df.groupby(['GROUP','GRADE']).agg(funcs) 
Out[59]: 
      TOTAL_SERVICE_TIME    TOTAL_WAIT_TIME 
        mean_service count_service  count_wait mean_wait 
GROUP GRADE 
AAA 1     72.5    2    2  60 
     4     40.0    1    1  23 
     5     35.0    1    1  21 
BBB 2     30.0    1    1  24 
     3     55.0    1    1  22 

jetzt Sie können die Spalte Ebene fallen.

x = df.groupby(['GROUP','GRADE']).agg(funcs) 
x.columns = x.columns.droplevel(0) 


In [63]: x 
Out[63]: 
      mean_service count_service count_wait mean_wait 
GROUP GRADE 
AAA 1    72.5    2   2   60 
     4    40.0    1   1   23 
     5    35.0    1   1   21 
BBB 2    30.0    1   1   24 
     3    55.0    1   1   22 

In [64]: x.reset_index() 
Out[64]: 
    GROUP GRADE mean_service count_service count_wait mean_wait 
0 AAA  1   72.5    2   2   60 
1 AAA  4   40.0    1   1   23 
2 AAA  5   35.0    1   1   21 
3 BBB  2   30.0    1   1   24 
4 BBB  3   55.0    1   1   22 
+0

Danke. "COUNT" sollte die Anzahl der Zeilen zählen, die zu jeder Kombination von "GROUP" und "GRADE" gehören, aber in dieser Lösung werden "GROUP", "GRADE", "TOTAL_SERVICE_TIME" und "TOTAL_WAIT_TIME" verwendet. – Dinosaurius

+0

@Dinosaurus, Sie haben einen Datensatz zur Verfügung gestellt, wo alle Gruppen nur ein Element haben, deshalb habe ich eine Zeile hinzugefügt mit 'TOTAL_SERVICE_TIME = 100, TOTAL_WAIT_TIME = 100' – MaxU

+0

@Dinosaurius, können Sie die Ausgabe von' print (x .columns) '_vor_drop? – MaxU

Verwandte Themen