2016-12-09 3 views
2

Ich habe eine Frage, die mir den Kopf bricht. Angenommen , dass ich den nächsten Datenrahmen habe:Arbeiten mit Gruppen in Pandas

df2 = pd.DataFrame(np.random.randint(0,3,size=(10, 4)),columns=['ONE', 'TWO', 'CARS', 'FOUR']) 
df2['NAMES'] = ['Peter','Jon','Mary','Mary','Peter','Peter','BONIFACE','Michael','Lucy','Gilari'] 
df2['CARS'] = ['Mercedes','BMW','Ford','BMW','BMW','Dacia','Ford','Pontiac','Chevrolet','Tesla'] 

Und ich Gruppe es von Autos, zum Beispiel.

agrupe = df2.groupby(['CARS']) 

Die Sache ist, dass, sobald ich es gruppiert habe ich mit ihm zum Beispiel in der Gruppe von BMW gemacht, betreiben möchte ich den Wert der Spalte 2 bis Spalte 4 aus den Elementen zuordnen wollen, die eine 2 haben in Spalte eins. Mal sehen, wenn ich lernen, es zu betreiben:

g = agrupe.get_group('BMW') 

und gehen von diesem

 ONE TWO CARS FOUR NAMES 
1 1 0 BMW  1 Jon 
3 2 1 BMW  1 Mary 
4 0 1 BMW  0 Peter 

dazu:

ONE TWO CARS FOUR NAMES 
1 1 0 BMW  1 Jon 
3 2 1 BMW  1 Mary 
4 0 1 BMW  1 Peter 
+0

Könnten Sie 'Ich möchte den Wert von Spalte 2 zu Spalte 4 aus den Elementen zuweisen, die eine 2 in der Spalte EINS haben. '? Spalte 'ZWEI' oder Spalte zwei =' AUTOS'? Plus, das angegebene Beispiel passt nicht zu dem, was du gesagt hast – MMF

+0

Sorry, meine Muttersprache ist nicht englisch. Ich mache Gruppen mit Autos, und dann überprüfe ich die Werte der anderen Spalte, sagen wir col ONE. Die Werte, die eine 2 in Spalte ONE haben, geben ihren Wert von Spalte ZWEI an Spalte VIER. Ich hoffe, jetzt ist es klarer. Danke –

+0

Nicht das Problem. Mit col2 meinst du Spalte 'TWO' oder df.columns [2]? – MMF

Antwort

1

Es scheint, Sie müssen groupby mit benutzerdefinierten Funktion f:

np.random.seed(100) 
df2 = pd.DataFrame(np.random.randint(0,3,size=(10, 4)),columns=['ONE', 'TWO', 'CARS', 'FOUR']) 
df2['NAMES'] = ['Peter','Jon','Mary','Mary','Peter','Peter','BONIFACE','Michael','Lucy','Gilari'] 
df2['CARS'] = ['Mercedes','BMW','Ford','BMW','BMW','Dacia','Ford','Pontiac','Chevrolet','Tesla'] 
print (df2) 
    ONE TWO  CARS FOUR  NAMES 
0 0 0 Mercedes  2  Peter 
1 2 0  BMW  1  Jon 
2 2 2  Ford  2  Mary 
3 1 0  BMW  0  Mary 
4 0 2  BMW  1  Peter 
5 1 2  Dacia  0  Peter 
6 0 1  Ford  1 BONIFACE 
7 0 0 Pontiac  1 Michael 
8 1 2 Chevrolet  2  Lucy 
9 1 1  Tesla  2 Gilari 
def f(x): 
    if (x.name == 'BMW'): 
     x.loc[x.ONE == 2, 'FOUR'] = x.TWO 
    return x 

agrupe = df2.groupby('CARS').apply(f) 
print (agrupe) 
    ONE TWO  CARS FOUR  NAMES 
0 0 0 Mercedes  2  Peter 
1 2 0  BMW  0  Jon 
2 2 2  Ford  2  Mary 
3 1 0  BMW  0  Mary 
4 0 2  BMW  1  Peter 
5 1 2  Dacia  0  Peter 
6 0 1  Ford  1 BONIFACE 
7 0 0 Pontiac  1 Michael 
8 1 2 Chevrolet  2  Lucy 
9 1 1  Tesla  2 Gilari 

bessere Lösung ist, zuerst alle Zeilen auswählen, in den Spalt CARSBMW ist und Spalte ONE ist 2 und dann FOUR durch TWO Spalt ändern:

df2.loc[(df2.CARS == 'BMW') & (df2.ONE == 2), 'FOUR'] = df2.TWO 
print (df2) 
    ONE TWO  CARS FOUR  NAMES 
0 0 0 Mercedes  2  Peter 
1 2 0  BMW  0  Jon 
2 2 2  Ford  2  Mary 
3 1 0  BMW  0  Mary 
4 0 2  BMW  1  Peter 
5 1 2  Dacia  0  Peter 
6 0 1  Ford  1 BONIFACE 
7 0 0 Pontiac  1 Michael 
8 1 2 Chevrolet  2  Lucy 
9 1 1  Tesla  2 Gilari 

Oder wenn nötig, wenn 2 in Spalte ändern ONE so Spalte FOUR durch Spalte TWO ändern:

np.random.seed(13) 
df2 = pd.DataFrame(np.random.randint(0,3,size=(10, 4)),columns=['ONE', 'TWO', 'CARS', 'FOUR']) 
df2['NAMES'] = ['Peter','Jon','Mary','Mary','Peter','Peter','BONIFACE','Michael','Lucy','Gilari'] 
df2['CARS'] = ['Mercedes','BMW','Ford','BMW','BMW','Dacia','Ford','Pontiac','Chevrolet','Tesla'] 
print (df2) 
    ONE TWO  CARS FOUR  NAMES 
0 2 0 Mercedes  0  Peter 
1 2 2  BMW  1  Jon 
2 0 2  Ford  0  Mary 
3 2 2  BMW  2  Mary 
4 1 1  BMW  1  Peter 
5 0 2  Dacia  1  Peter 
6 2 1  Ford  2 BONIFACE 
7 0 0 Pontiac  0 Michael 
8 2 2 Chevrolet  0  Lucy 
9 1 1  Tesla  2 Gilari 


df2.loc[df2.ONE == 2, 'FOUR'] = df2.TWO 
print (df2) 
    ONE TWO  CARS FOUR  NAMES 
0 2 0 Mercedes  0  Peter 
1 2 2  BMW  2  Jon 
2 0 2  Ford  0  Mary 
3 2 2  BMW  2  Mary 
4 1 1  BMW  1  Peter 
5 0 2  Dacia  1  Peter 
6 2 1  Ford  1 BONIFACE 
7 0 0 Pontiac  0 Michael 
8 2 2 Chevrolet  2  Lucy 
9 1 1  Tesla  2 Gilari 
+0

Das sieht sehr schön aus, lassen Sie mich überprüfen, danke –

+0

, wenn hinzufügen vor np.random 'np.random.seed (100)' bekomme die gleiche Ausgabe wie meine Antwort .. – jezrael

+0

Es ist nicht richtig.Ich gruppierte mich nach Autos und arbeitete dann mit BMW nur ​​als Beispiel. Die Sache ist, dass, sobald ich gruppiert habe, ich nicht die Namen jeder Gruppe weiß, wenn (x.name == 'BMW'): ist falsch, löschte einmal dieses Teil die Funktion überhaupt nicht gut. Ich habe diesen Teil def f (x) verwendet: x.loc [x.ONE == 2, 'VIER'] = x.TWO zurück x –

Verwandte Themen