2013-06-09 13 views
9

Einige meiner Daten wie folgt aussehen:Python Pandas - Verschmelzung meist dupliziert Reihen

date, name, value1, value2, value3, value4 
1/1/2001,ABC,1,1,, 
1/1/2001,ABC,,,2, 
1/1/2001,ABC,,,,35 

Ich versuche, auf den Punkt zu kommen, wo ich

data.set_index(['date', 'name']) 

Aber mit den Daten ausgeführt werden kann als - Es gibt natürlich Duplikate (wie oben gezeigt), also kann ich das nicht tun (und ich will keinen Index mit Duplikaten, und ich kann nicht einfach drop_duplicates(), da dies Daten verlieren würde).

Ich würde gerne in der Lage sein, Zeilen, die die gleichen [Datum, Name] -Werte in einer einzigen Zeile haben, zu erzwingen, wenn sie erfolgreich konvergiert werden können basierend auf bestimmten Werten NaN (ähnlich dem Verhalten von combine_first()) . Zum Beispiel bei

date, name, value1, value2, value3, value4 
1/1/2001,ABC,1,1,2,35 

die oben enden würde Wenn zwei Werte unterschiedlich sind und man ist nicht NaN, die beiden Reihen nicht konvergiert werden soll (dies ist wahrscheinlich ein Fehler wäre, die ich brauchen würde, auf Follow-up).

(auf das obige Beispiel erstrecken, besteht in der Tat eine beliebige Anzahl von Zeilen kann - eine beliebige Anzahl von Spalten angegeben -. Die in der Lage sein sollte, in eine einzige Linie konvergiert werden)

Dies fühlt wie ein Problem, das mit Pandas sehr lösbar sein sollte, aber ich habe Probleme, eine elegante Lösung zu finden.

Antwort

11

Stellen wir uns vor, Sie haben eine Funktion combine_it, die bei einer Reihe von Zeilen mit doppelten Werten eine einzelne Zeile zurückgibt. Zuerst Gruppe von date und name:

grouped = data.groupby(['date', 'name']) 

Dann gelten nur die Aggregationsfunktion und Boom Sie sind fertig:

result = grouped.agg(combine_it) 

Sie können auch verschiedene Aggregationsfunktionen für verschiedene Spalten bieten durch agg vorbei ein Diktat.

+0

Danke, das ist definitiv ein wichtiger Schritt. Gibt es dafür eine besonders effiziente Ausdrucksweise? Nach meiner Erfahrung (und ersten Tests mit Ihrem Vorschlag) kann .agg() zu einer sehr langsamen Ausführung führen (wahrscheinlich nicht überraschend). Vielleicht unvermeidbar? – severian

+0

Vielleicht? Sie könnten versuchen, eingebaute numpy-Funktionen ("sum", "max" usw.) zu verwenden, um die Geschwindigkeit zu erhöhen (die cythonisierte Funktionen verwendet). Dies liegt wahrscheinlich außerhalb des normalen Anwendungsfalls für groupby, da Sie wahrscheinlich viele Gruppen relativ zur Gesamtgröße des DataFrames haben. –

+0

Nun, abgesehen von einer anderen Antwort weiß ich zumindest, dass ich nichts zu offensichtlich übersehen habe ... – severian

0

Wenn Sie keine numerischen Feldwerte haben, ist das Aggregieren mit count, min, sum usw. weder möglich noch sinnvoll. Trotzdem möchten Sie immer noch doppelte Datensätze in einzelne Datensätze (z. B.) basierend auf einem oder mehreren Primärschlüsseln reduzieren.

# Firstly, avoid Nan values in the columns you are grouping on! 
df[['col1', 'col2']] = df[['col1', 'col2']].fillna('null') 


    # Define your own customized operation in pandas agg() function 
df = df.groupby(['col1', 'col2']).agg({'SEARCH_TERM':lambda x: ', '.join(tuple(x.tolist())), 

            'HITS_CONTENT':lambda x: ', '.join(tuple(x.tolist()))} 
            ) 

Gruppe durch eine oder mehrere Spalten und collapse Werte Werte, indem sie zuerst Umwandeln aufzulisten, dann Zeichenfolge Tuple und schließlich. Wenn Sie möchten, können Sie sie auch als Liste oder Tupel in jedem Feld speichern oder mit dem agg anwenden. Funktion und ein Wörterbuch sehr unterschiedliche Operationen zu verschiedenen Spalten.

Verwandte Themen