2017-02-17 3 views
1

Ich arbeite mit mehreren Tabellen, die viele-zu-viele Beziehungen haben. Was ist der effizienteste Weg, um diese Daten zu transformieren, um sicherzustellen, dass die Kategoriespalte eindeutig ist und dass alle entsprechenden Einheiten in einer einzigen Zeile zusammengefasst sind?Kombinieren von Werten aus mehreren Zeilen in einer einzigen Zeile

category unit 
A01   97337 
A01   97333 
A01   97334 
A01   97343 
A01   26223 
A01   26226 
A01   22722 
A01   93397 
A01   97332 
A01   97342 
A01   97369 
A01   97734 
A01   97332 
P76   97343 
P76   26223 
P76   27399 
P76   27277 
P76   27234 
P76   27297 
P76   27292 
P76   22723 
P76   93622 
P76   27343 
P76   27234 
P98   97337 

In diese:

category category_units 
A01  97337, 97333, 97334, 97343, 26223, 26226, 22722, 93397, 97332, 97342, 97369, 97734, 97332 
P76  97343, 26223, 93622, 99733, 27399, 27277, 27234, 27297, 27292 
P98  97337 

eine Zeile pro Kategorie (dient als ein Primärschlüssel), wobei jeder der entsprechenden Einheiten sind in einer einzigen Spalte konkateniert mit durch Komma getrennten Werte.

Ich würde diese Daten zurück zu einer anderen Faktentabelle beitreten und schließlich würde der Endbenutzer nach category_units filtern, wo es einen Wert enthält, so dass es alle Zeilen heraufziehen würde, die diesem Wert zugeordnet sind.

Antwort

3

Sie können groupby mit applyjoin, verwenden, wenn unit Spalte numerisch ist notwendig cast string ist:

df1 = df.groupby('category')['unit'] 
     .apply(lambda x: ', '.join(x.astype(str))) 
     .reset_index() 
print (df1) 
    category            unit 
0  A01 97337, 97333, 97334, 97343, 26223, 26226, 2272... 
1  P76 97343, 26223, 27399, 27277, 27234, 27297, 2729... 
2  P98            97337 

Eine andere Lösung mit Gießen zuerst:

df.unit = df.unit.astype(str) 
df1 = df.groupby('category')['unit'].apply(', '.join).reset_index() 
print (df1) 
    category            unit 
0  A01 97337, 97333, 97334, 97343, 26223, 26226, 2272... 
1  P76 97343, 26223, 27399, 27277, 27234, 27297, 2729... 
2  P98            97337 
+0

Cool, funktioniert super. Aufgrund der Art einiger meiner Joins (viele Zwischentabellen) hat mein Endergebnis einige Duplikate in einer Reihe. Beispiel: category = A01, units = 97337, 26223, 97337. Gibt es eine Möglichkeit, die Duplikate auf Zeilenebene sauber zu entfernen? Ich dachte an die Verwendung von .str.split(), aber dann wusste ich nicht, wie ich nur die eindeutigen Werte pro Zeile beibehalten konnte. – trench

+1

Sie können 'set' oder' unique' verwenden wie 'df1 = df.groupby ('category') ['unit'] .apply (Lambda x: ',' .join (x.unique(). Astyp (str))) 'oder' df1 = df.groupby ('category') ['unit'] .apply (lambda x: ',' .join (setzen (x.astype (str)))) ' – jezrael

+0

Das alles hat funktioniert perfekt. Ich musste tatsächlich mehrere Viele-zu-Viele-Tabellen anwenden und die Ergebnisse sind genau das, was ich wollte. Danke – trench

Verwandte Themen