2017-10-23 2 views
1

Ich habe eine Sammlung von Daten, die durch eine Reihe von Postleitzahlen indiziert ist. Ich möchte diese Daten nach der Nähe zu anderen geografischen Merkmalen, sagen wir, Entfernung zu einem nahe gelegenen See aggregieren.Nach Kategorie gruppieren, wenn Elemente zu mehreren Kategorien gehören

Es ist einfach genug zu sagen, Schleife durch jeden See in einem Datenrahmen und wenden Sie eine Haversine-Funktion, um alle Postleitzahlen innerhalb von 50 Meilen zurückzugeben. Oder umgekehrt; Ich kann einfach alle Postleitzahlen durchgehen und für jede eine Liste von Seen innerhalb von 50 Meilen von dieser Postleitzahl zurückgeben.

Aber ich möchte das ein bisschen effizienter machen. Wenn jeder Zip nur einem See entspricht, z. B. dem nächstgelegenen, besteht die einfache Möglichkeit darin, eine neue "lake"-Spalte zu erstellen und dann groupby("lake") anzuwenden, um die klassierten Daten zur Verarbeitung zu erhalten.

Was ich möchte ist eine Technik zum automatischen Duplizieren von Zeilen vor einer Gruppe durch. Sprich ich folgende Daten hatte:

 lake 
zip 
10001 Huron 
10002 Huron, Erie 
10003 Erie, Superior 

Ich möchte groupby nennen Folgendes zurück:

group 'Huron' 
zip 
10001 
10002 

group 'Erie' 
zip 
10002 
10003 

group 'Superior' 
zip 
10003 

Im Grunde ist es eine nette Art und Weise, dies zu tun, oder Sie sind im Wesentlichen mit den stecken Dirty-Loop-Through-Indices-Methode?

Antwort

1

Option 1
str.split mit expand=True, gefolgt von stack + groupby. Dies gibt Gruppen zurück.

g = df.lake.str.split(',\s*', expand=True).stack()\ 
      .to_frame(name='lake').reset_index(level=1, drop=1).groupby('lake') 

for i, k in g: 
    print(k, '\n') 

     lake 
zip   
10002 Erie 
10003 Erie 

     lake 
zip   
10001 Huron 
10002 Huron 

      lake 
zip    
10003 Superior 

Option 2
str.get_dummies, meine bevorzugte Methode. Dies gibt Ihr Ergebnis nicht in Gruppen zurück, aber get_dummies erzeugt implizit OHEs, die Sie in Gruppierungen übersetzen können.

g = df.lake.str.get_dummies(sep=r', ') 

for c in g.columns: 
    print('{}: {}'.format(c, g[c][g[c] > 0].index.tolist())) 

Erie: [10002, 10003] 
Huron: [10001, 10002] 
Superior: [10003] 
+0

Dies hat den Trick gemacht. Prost. –

Verwandte Themen