2016-12-23 7 views
1

Ich habe einen Pandas Datenrahmen df die wie folgt aussieht:Aufrunden eine Spalte in Pandas Datenrahmen

  no_obs price_cleaning house_size 
0   1    585   30 
1   1    585   40 
2   1    585   43 
3   1    650   43 
4   1    633   44 
5   1    650   45 
6   2    585   50 
7   1    633   50 
8   1    650   50 
9   2    750   50 

Ich mag aufrunden die Werte in den price_cleaning Spalt mit dieser Funktion:

Ich habe versucht, die Lösung aus dieser Antwort (Applying function to Pandas dataframe by column):

cols = [col for col in df.columns if col != 'price_cleaning'] df[cols] = df[cols].apply(roundup)

bekomme ich folgende Fehlermeldung: Typeerror: („kann die Serie nicht konvertieren“, ‚bei Index no_obs aufgetreten‘)

Kann jemand mir helfen, zu verstehen, warum dies nicht funktioniert? Wie wende ich die Roundup-Funktion auf die Spalte an? Jede Hilfe wird sehr geschätzt.

Antwort

2

die Spalten den Kopf, dies zu tun, anstatt Sie sind Filterung:

cols = [col for col in df.columns if col == 'price_cleaning'] 

Wenn Sie jetzt nur eine Spalte bereinigen müssen, müssen Sie sie nicht erstellen cols. Just do:

df['price_cleaning'] = df['price_cleaning'].apply(roundup) 
+0

'apply' Methoden sind großartig. Basierend auf Ihrer Anwendungsfallgröße können Sie jedoch mit vektorisierten Methoden Benchmarking betreiben. – Zero

+0

@JohnGalt Ich denke, OP ist weit entfernt von Ihrer genauen Bemerkung an dieser Stelle – Boud

+0

Richtig, das ist nur für die Nachwelt :) – Zero

2

Dies könnte funktionieren:

>>> df['price_cleaning_ceiling']= df.price_cleaning.apply(lambda x: int(math.ceil(x/10.0)) * 10) 
1

ich glaube, Sie apply und lambda als verwenden können:

In [6]: df['p'] = df['price_cleaning'].apply(lambda x: int(math.ceil(x/10.0)) * 10) 

In [7]: df 
Out[7]: 
    no_obs price_cleaning house_size p 
0  1    585   30 590 
1  1    585   40 590 
2  1    585   43 590 
3  1    650   43 650 
4  1    633   44 640 
5  1    650   45 650 
6  2    585   50 590 
7  1    633   50 640 
8  1    650   50 650 
9  2    750   50 750 
3

I wie

In [298]: df['p'] = (np.ceil(df.price_cleaning/10) * 10).astype(int) 

In [299]: df 
Out[299]: 
    no_obs price_cleaning house_size p 
0  1    585   30 590 
1  1    585   40 590 
2  1    585   43 590 
3  1    650   43 650 
4  1    633   44 640 
5  1    650   45 650 
6  2    585   50 590 
7  1    633   50 640 
8  1    650   50 650 
9  2    750   50 750 

Für 10K Reihen vektorisiert würde, Timings - vektorisiert Methode ist ~ 15x mal schneller apply

In [331]: %timeit (np.ceil(dff.price_cleaning/10) * 10).astype(int) 
1000 loops, best of 3: 436 µs per loop 

In [332]: %timeit dff['price_cleaning'].apply(roundup) 
100 loops, best of 3: 7.86 ms per loop 

In [333]: dff.shape 
Out[333]: (10000, 4) 

Atleast in diesem Fall Leistung Lücke, mit mehr Zeilen, wird zunehmen.

Verwandte Themen