2017-02-02 4 views
2

Ich möchte die Spalte von anderen Reihe von Pandas Datenrahmen zu berechnen.Python - Pandas: wie durch spezifischen Schlüssel Wert

Zum Beispiel, wenn ich diesen Datenrahmen habe,

df = pd.DataFrame({ 
    "year" : ['2017', '2017', '2017', '2017', '2017','2017', '2017', '2017', '2017'], 
    "rooms" : ['1', '2', '3', '1', '2', '3', '1', '2', '3'], 
    "city" : ['tokyo', 'tokyo', 'toyko', 'nyc','nyc', 'nyc', 'paris', 'paris', 'paris'], 
    "rent" : [1000, 1500, 2000, 1200, 1600, 1900, 900, 1500, 2200], 
}) 

print(df) 

    city rent rooms year 
0 tokyo 1000  1 2017 
1 tokyo 1500  2 2017 
2 toyko 2000  3 2017 
3 nyc 1200  1 2017 
4 nyc 1600  2 2017 
5 nyc 1900  3 2017 
6 paris 900  1 2017 
7 paris 1500  2 2017 
8 paris 2200  3 2017 

Ich mag die Miete hinzufügen im Vergleich zu anderer Miete Stadt im selben Jahr und Zimmer.

Ideal Ergebnisse sind unten wie,

city rent rooms year vs_nyc 
0 tokyo 1000  1 2017 0.833333 
1 tokyo 1500  2 2017 0.9375 
2 toyko 2000  3 2017 1.052631 
3 nyc 1200  1 2017 1.0 
4 nyc 1600  2 2017 1.0 
5 nyc 1900  3 2017 1.0 
6 paris 900  1 2017 0.75 
7 paris 1500  2 2017 0.9375 
8 paris 2200  3 2017 1.157894 

Wie Spalte wie vs_nyc unter Berücksichtigung des Jahres und Zimmer hinzufügen?

habe ich versucht, einige, aber nicht funktionierte,

# filtering gets NaN value, and fillna(method='pad') also not worked 

df.rent/df[df['city'] == 'nyc'].rent 

0 NaN 
1 NaN 
2 NaN 
3 1.0 
4 1.0 
5 1.0 
6 NaN 
7 NaN 
8 NaN 
Name: rent, dtype: float64 
+0

Ich denke, es könnte ein schöner Weg, dies auf oder Abstapeln von der Stadt mit dem ersten Schwenk zu tun und/oder mieten Spalten. – pbreach

+0

@pbreach Vielen Dank für den Kommentar. Wie du gesagt hast, hat piRSquared den Weg dafür geebnet! – evalphobia

Antwort

2

Zur Veranschaulichung:

set_index + unstack

d1 = df.set_index(['city', 'year', 'rooms']).rent.unstack('city') 

d1 

city   nyc paris tokyo toyko 
year rooms         
2017 1  1200.0 900.0 1000.0  NaN 
    2  1600.0 1500.0 1500.0  NaN 
    3  1900.0 2200.0  NaN 2000.0 

Dann können wir teilen


Lösung

d1 = df.set_index(['city', 'year', 'rooms']).rent.unstack('city') 
df.join(d1.div(d1.nyc, 0).stack().rename('vs_nyc'), on=['year', 'rooms', 'city']) 

    city rent rooms year vs_nyc 
0 tokyo 1000  1 2017 0.833333 
1 tokyo 1500  2 2017 0.937500 
2 toyko 2000  3 2017 1.052632 
3 nyc 1200  1 2017 1.000000 
4 nyc 1600  2 2017 1.000000 
5 nyc 1900  3 2017 1.000000 
6 paris 900  1 2017 0.750000 
7 paris 1500  2 2017 0.937500 
8 paris 2200  3 2017 1.157895 

Ein wenig aufgeräumt

cols = ['city', 'year', 'rooms'] 
ny_rent = df.set_index(cols).rent.loc['nyc'].rename('ny_rent') 
df.assign(vs_nyc=df.rent/df.join(d1, on=d1.index.names).ny_rent) 
+0

Cool! Danke für die klare Antwort! – evalphobia

+0

Sie können auch 'd1 = df.pivot_table (index = ['Jahr', 'Raum'], Spalten = 'Stadt', Werte = 'mieten')' verwenden, um die erste Zeile zu vereinfachen, aber die bereinigte Version aussieht noch besser. – pbreach

Verwandte Themen