2016-09-12 4 views
-3

In pandas Sie einige groupby Funktionen für jede Spalte in einem Datenrahmen anwenden können, wie im Fall von:Pandas Nehmen groupby Funktion jeder Spalte effizient

pt=df.groupby(['Group']).sum().reset_index() 

Lets sagen, dass ich lambda x: (0 < x).sum() eine Lambda-Funktion anwenden möchten Zählen Sie Zellen mit einem Wert in ihnen und fügen Sie dann eine Zählung der gesamten Elemente in jeder Gruppe hinzu. Gibt es eine effizientere Möglichkeit, dies auf alle Spalten anwenden außer diesen Code zu wiederholen:

import pandas as pd 

df=pd.DataFrame({'Group':['W', 'W', 'W', 'E','E','E','N'], 
'A':[0,1,5,0,1,5,7], 
'B':[1,0,5,0,0,2,0], 
'C':[1,1,5,0,0,5,0], 
'Total':[2,2,15,0,1,12,7] 
}) 

#Check how many items are present in Group 
grp=df.groupby(['Group']) 
pt1 = grp['A'].apply(lambda x: (0 < x).sum()).reset_index() 
pt2 = grp['B'].apply(lambda x: (0 < x).sum()).reset_index() 
pt3 = grp['C'].apply(lambda x: (0 < x).sum()).reset_index() 

pct=pd.merge(pt1, pt2, on=['Group']) 
pct=pd.merge(pt2, pct, on=['Group']) 

#Get total items and merge with counts 
pt = df.groupby(['Group'])['Total'].count().reset_index() 
pct=pd.merge(pt, pct, on=['Group']) 

Ausgang:

Group Total C A B 
0  E  3 1 2 1 
1  N  1 0 1 0 
2  W  3 3 2 2 

Was für eine effiziente Art und Weise ist es für n Spalten zu schreiben?

+0

Ich bin mir nicht sicher, ob ich das richtig verstanden. Ich kann den letzten Teil nicht ausführen, da ich nicht weiß, was die 'Total'-Spalte darstellt, sondern' grp [['A', 'B', 'C']]. Apply (Lambda x: (0 ayhan

+0

@ayhan Art von aber für den gesamten Datenrahmen nicht nur A, B, C gibt es einen Weg. Ich versuchte 'pct = df.groupby (['Group']). Apply (Lambda x: (0 ccsv

+1

Es kann sein. Sie müssen jedoch einen Beispieldatenrahmen und Ihre erwartete Ausgabe bereitstellen. Wenn du sagst, dass es nicht funktioniert, weiß ich nicht, was schief gelaufen ist. Wenn du also ein Beispiel für deine erwartete Ausgabe nennst, wäre es einfacher, dir zu helfen. – ayhan

Antwort

2

Die sauberste Art, wie ich denken kann, ist dies:

(df > 0).groupby(df['Group']).agg({'A': 'sum', 'B': 'sum', 'C': 'sum', 'Total': 'count'}) 
Out: 
     C Total B A 
Group      
E  1.0  3 1.0 2.0 
N  0.0  1 0.0 1.0 
W  3.0  3 2.0 2.0 

Sie sortieren und gegossen in int, wenn Sie wollen:

((df > 0).groupby(df['Group']).agg({'A': 'sum', 'B': 'sum', 'C': 'sum', 'Total': 'count'}) 
           .sort_index(axis=1).astype('int') 
Out: 
     A B C Total 
Group     
E  2 1 1  3 
N  1 0 0  1 
W  2 2 3  3 
+1

muss ich jeden Spaltennamen definieren oder gibt es eine Möglichkeit, auf den gesamten Datenrahmen anzuwenden? (zB wenn ich 'pt = df.groupby (['Group']). sum(). reset_index()') Ich kann die Ergebnisse erhalten, ohne die Spaltennamen zu definieren. – ccsv

+1

Da Sie verschiedene Funktionen auf verschiedene Spalten anwenden, glaube ich nicht, dass das möglich ist (anders als ich es im Kommentar vorgeschlagen habe). – ayhan

Verwandte Themen