2017-07-28 2 views
2

Ich bin ein Neuling in Pandas. Ich habe den folgenden Datensatz. Stellen Sie sich den Datensatz als Abteilungen ('k1') und Personen ('k2') eines Unternehmens vor.Wie zu filtern gruppiert von in Pandas

dframe = pd.DataFrame({'k1': ['X','X','Y','Y','Z','Z'], 
    ...:       'k2': ['P1','P2','P3','P4','P5','P6'], 
    ...:       'dataset1': np.random.randn(6)}) 
    ...: 

Wenn ich den Mittelwert von dept gruppiert nehmen/‚k1‘ ich folgendes

dataset1 
k1 
X 0.153825 
Y -0.648500 
Z 1.133334 

erhalten, wenn ich den Mittelwert gruppiert von Menschen/‚k2‘ nehmen, bekomme ich die folgende

In [6]: dframe.groupby('k2').mean() 
Out[6]: 
    dataset1 
k2 
P1 1.595455 
P2 -1.287805 
P3 0.211858 
P4 -1.508859 
P5 1.350336 
P6 0.916332 

Meine Frage ist, wie kann ich nur die nach Personen gruppierten Mittelwerte/'k2' filtern, die größer als der Mittelwert von dept/'k1' ist, zu dem es gehört. z.B. P1 Mittelwert größer ist als X Mittelwert, auf die sie

Out[6]: 
    dataset1 
k2 
P1 1.595455 
P3 0.211858 
P5 1.350336 
+1

Vielen Dank jezrael. Ich habe verstanden, was Transformation macht. Schön –

Antwort

3

Probe gehört (P6 zu P5 geändert):

np.random.seed(45) 
dframe = pd.DataFrame({'k1': ['X','X','Y','Y','Z','Z'], 
         'k2': ['P1','P2','P3','P4','P5','P5'], 
          'dataset1': np.random.randn(6)}) 

print (dframe) 
    dataset1 k1 k2 
0 0.026375 X P1 
1 0.260322 X P2 
2 -0.395146 Y P3 
3 -0.204301 Y P4 
4 -1.271633 Z P5 
5 -2.596879 Z P5 

Erste neue Spalte erstellen, indem groupby und transform:

dframe['meank1'] = dframe.groupby('k1').transform('mean') 
print (dframe) 
    dataset1 k1 k2 meank1 
0 0.026375 X P1 0.143348 
1 0.260322 X P2 0.143348 
2 -0.395146 Y P3 -0.299723 
3 -0.204301 Y P4 -0.299723 
4 -1.271633 Z P5 -1.934256 
5 -2.596879 Z P5 -1.934256 

Dann aggregieren durch aggmean und first, auch ist notwendig Fügen Sie k1 Spalte zu groupby hinzu, um falsche Ausgabe zu vermeiden, wenn dieselbe k2 in einer anderen k1.

dframe = dframe.groupby(['k1','k2']).agg({'dataset1':'mean', 'meank1':'first'}) 
print (dframe) 
     meank1 dataset1 
k1 k2      
X P1 0.143348 0.026375 
    P2 0.143348 0.260322 
Y P3 -0.299723 -0.395146 
    P4 -0.299723 -0.204301 
Z P5 -1.934256 -1.934256 

Letzter Filter von boolean indexing oder query:

dframe = dframe.loc[dframe['meank1'] > dframe['dataset1'], ['dataset1']] 
#alternative sol 
#dframe = dframe.query('meank1 > dataset1')[['dataset1']] 
print (dframe) 
     dataset1 
k1 k2   
X P1 0.026375 
Y P3 -0.395146 

Und wenn erste Ebene der MultiIndexreset_index hinzufügen entfernen möchten:

dframe = dframe.reset_index(level=0, drop=True) 
print (dframe) 
    dataset1 
k2   
P1 0.026375 
P3 -0.395146 

Für Spalte aus dem Index Verwendung:

dframe = dframe.reset_index(level=0, drop=True).reset_index() 
print (dframe) 
    k2 dataset1 
0 P1 0.026375 
1 P3 -0.395146