2017-08-24 4 views
1

In Pandas, ich habe ein Datenrahmen von einer bestimmten Spalte gesucht, für eine allgemeine Strömung zu einer Gruppe auf den Gruppen nicht-triviale Operationen durchführt und dann die Gruppen Rekonstitution wieder zurück in einen großen Datenrahmen (indem sie effektiv übereinander gestapelt werden).Gruppierung, Bearbeitung und Wiederverbindungsgruppen effizient in Pandas

Man stelle ich habe einen Datenrahmen df:

+----+-------+---+---+---+ 
| | A | B | C | D | 
+----+-------+---+---+---+ 
| 0 | Green | 1 | 4 | 5 | 
| 1 | Red | 2 | 3 | 2 | 
| 2 | Red | 1 | 4 | 3 | 
| 3 | Green | 2 | 2 | 2 | 
| 4 | Green | 1 | 1 | 1 | 
| 5 | Blue | 2 | 1 | 5 | 
| 6 | Red | 2 | 1 | 6 | 
| 7 | Blue | 7 | 8 | 9 | 
| 8 | Green | 7 | 6 | 5 | 
| 9 | Red | 0 | 9 | 0 | 
| 10 | Blue | 4 | 5 | 4 | 
+----+-------+---+---+---+ 

Ich möchte Spalte A bis GROUPBY() und dann für jede Gruppe eine Operation durchführen. Typischerweise beinhaltet diese Operation neue Zeilen zu schaffen, indem den Wert in einer Zeile mit dem Wert in der Zeile zu vergleichen, für alle Zeilen, so würde ich nicht sagen, dass es mit einer Lambda-Funktion auf die Gruppen angewandt getan werden könnte. Dann will ich wieder zusammen, diese Gruppen setzen in Datenrahmen, effektiv im gleichen Format wie oben, aber mit den eingefügten Zeilen.

Mein allgemeiner Ansatz ist bisher die „langsam und dumm“ Art und Weise zu tun, das heißt:

group_list = [] 

g = df.groupby("A") 
for i, group in g: 

    ###Perform some weird operation on group that can't really be reduced to a 
    #lambda function applied to each group. 

    group_list.append(group) 

reconstituted = group_list[0] 
for i in range(1,len(group_list)): 
    reconstituted = reconstituted.append(group_list[i], ignore_index=True) 

Natürlich ist dies nicht besonders Pandas-esque, so dass meine Frage ist - was ist ein bessere Art und Weise, die Gruppen selbst zu bearbeiten und sie dann zu rekonstruieren?

+0

Nicht sicher, was Sie tun wollen, kann aber durch Spalte Wert den Job sortieren? df.sort_values ​​("A"), oder df.sort ("A") –

Antwort

0

Ohne zu wissen, was Ihre Funktion tut, wenn alles, was Sie gerade tun möchte, ist sie zurück zu kommen, können Sie pd.concat verwenden:

df_new = pd.concat(group_list) 

MVCE:

In [77]: df1 
Out[77]: 
    0 
0 a 
1 b 

In [78]: df2 
Out[78]: 
    0 
0 c 
1 d 

In [79]: pd.concat([df1, df2], ignore_index=True) 
Out[79]: 
    0 
0 a 
1 b 
0 c 
1 d 

jedoch ich möchte Sie bitten, eine andere Technik zu berücksichtigen, die nicht explizit beinhalten die Gruppen aufgeteilt und an ihnen arbeiten getrennt, das ist sehr ineffizient.

+0

Hallo, danke für die Antwort - 'concat' wird zumindest die letzten Zeilen verbessern. – ADS

+0

Fertig. Ja, ich werde eine neue Frage zur Manipulation von groupby-Objekten erstellen, nachdem ich einige Ansätze ausprobiert habe. – ADS

+0

@ADS Fantastisch, klingt für mich gut. –

0

die folgenden Codes können die Werte von Spalte A den Wert extrahieren

import pandas as pd 

df = pd.DataFrame([{'A': 'Green', 'B': 1}, {'A': 'Red', 'B': 2}, {'A': 'Green', 'B': 3}]) 

for value in df.A.unique(): 
    print(df[df.A == value]) 

, wenn man sie auf die df wieder nicht zusammenführen möchten, können Sie einfach ein

df.sort_values("A") 
den Wert von Spalte sortieren

und Sie können folgendes Ergebnis:

 A B 
0 Green 1 
2 Green 3 
1 Red 2 
Verwandte Themen