2016-08-31 11 views
3

Ich habe einen Datenrahmen in diesem Format:Graf Vorkommnisse in Datenrahmen

| Department | Person | Power | ... | 
|------------|--------|--------|-----| 
| ABC  | 1234 | 75 | ... | 
| ABC  | 1235 | 25 | ... | 
| DEF  | 1236 | 50 | ... | 
| DEF  | 1237 | 100 | ... | 
| DEF  | 1238 | 25 | ... | 
| DEF  | 1239 | 50 | ... | 

Was ich jetzt bekommen will, dass die Summe von Vorkommnissen für jeden Wert in der Energiesäule ist. Wie kann ich das von meinem Dataframe bekommen?

| Department | 100 | 75 | 50 | 25 | 
|------------|-----|-----|-----|-----| 
| ABC  | 0 | 1 | 0 | 1 | 
| DEF  | 1 | 0 | 2 | 1 | 
+1

Diese Frage viele Male vor, Sie könnten suchten nur – Jason

Antwort

4

Sie value_counts mit sort_index verwenden können, erzeugen dann DataFrame von to_frame und letzte transponieren von T:

print (df.Power.value_counts().sort_index(ascending=False).to_frame().T) 
     100 75 50 25 
Power 1 1 2 2 

EDIT von Kommentar:

Sie benötigen crosstab:

print (pd.crosstab(df.Department, df.Power).sort_index(axis=1, ascending=False)) 
Power  100 75 50 25 
Department      
ABC   0 1 0 1 
DEF   1 0 2 1 

Faster eine andere Lösung mit groupby und unstack:

print (df.groupby(['Department','Power']) 
     .size() 
     .unstack(fill_value=0) 
     .sort_index(axis=1, ascending=False)) 

Power  100 75 50 25 
Department      
ABC   0 1 0 1 
DEF   1 0 2 1 

Wenn Bedarf groupby durch Spalten Department und Person, Spalte Person-groupby zweite Position hinzufügen (danke piRSquared):

print (df.groupby(['Department','Person', 'Power']) 
     .size() 
     .unstack(fill_value=0) 
     .sort_index(axis=1, ascending=False)) 

Power    100 75 50 25 
Department Person      
ABC  1234  0 1 0 0 
      1235  0 0 0 1 
DEF  1236  0 0 1 0 
      1237  1 0 0 0 
      1238  0 0 0 1 
      1239  0 0 1 0 

EDIT1 von Kommentar:

Wenn weitere fehlende Werte hinzugefügt werden müssen, verwenden Sie reindex :

print (df.groupby(['Department','Power']) 
     .size() 
     .unstack(fill_value=0) 
     .reindex(columns=[100,75,50,25,0], fill_value=0)) 

Power  100 75 50 25 0 
Department       
ABC   0 1 0 1 0 
DEF   1 0 2 1 0 
+0

Danke, und wie kann ich es tun, wenn ich eine habe gefragt wurde zweite Spalte, auf der ich die Ergebnisse gruppieren möchte? – Gerrit

+0

Können Sie die gewünschte Ausgabe hinzufügen, sorry, ich verstehe nicht, was bedeutet, gruppieren Sie die Ergebnisse. – jezrael

+0

Danke, ich füge 2 Lösungen hinzu. Überprüfen Sie bitte das. – jezrael

1

oder es kann auf diese Weise geschehen:

>>> df.groupby(['Department','Power']).count().unstack().fillna(0) 

      Person    
Power   25 50 75 100 
Department      
ABC   1.0 0.0 1.0 0.0 
DEF   1.0 2.0 0.0 1.0