2017-12-23 7 views
0

Ich habe die Pandas Dokumentation und Kochbuch Rezepte und es ist klar, Sie können auf die nächste Dezimalstelle leicht mit dataframe.columnName.round(decimalplace) runden.Round to nächste 1000 in Pandas

Wie machst du das mit größeren Zahlen?

Beispiel, ich habe eine Spalte von Immobilienpreisen und ich möchte sie auf die nächsten 10000 oder 1000 oder was auch immer gerundet.

df.SalesPrice.WhatDoIDo(1000)? 
+2

Mögliche Duplikat [Wie runde ich auf die nächste zehn?] (https://stackoverflow.com/questions/39824914/how-do-i-round-to-the-nearest-ten) –

+1

Division durch 1000, rund, multiplizieren mit 1000 – Barmar

+0

Viele Sprachen haben viele iterative Wege, dies zu lösen. Obwohl es an SO-Fragen nicht mangelt, suchte ich nach einem spezifischen Pandas-Weg, um die Effizienz dieses Rahmens zu nutzen. – Angelo

Antwort

2

durch die Notation df.ColumnName.round() verwenden, werden Sie tatsächlich pandas.Series.round Aufruf, die Dokumentation, die angibt:

Dezimalstellen: int

Anzahl der Dezimalstellen abzurunden (Standard: 0) gewonnen. Wenn Dezimalstellen negativ sind, gibt es die Anzahl der Positionen links vom Dezimalpunkt an.

So können Sie tun:

df = pd.DataFrame({'val':[1,11,130,670]}) 
df.val.round(decimals=-2) 

Dies erzeugt die Ausgabe:

0  0 
1  0 
2 100 
3 700 
Name: val, dtype: int64 

decimals=-3 Runden auf die 1000er, und so weiter. Bemerkenswert ist, es funktioniert auch pandas.DataFrame.round() verwenden, obwohl die Dokumentation, die Sie nicht sagen:

df = pd.DataFrame({'val':[1,11,130,670], 'x':[1,11,150,900]}) 
df.round({'val':-2}) 

Dies rundet die Spalte val auf die nächsten 100, aber x allein lassen.

+0

Ich habe den Teil "wenn Dezimalstellen negativ sind" komplett verpasst. Vielen Dank! – Angelo

1

können Sie versuchen, diese

df = pd.DataFrame({'val':[1,11,130,670]}) 
10**df.val.astype(str).str.len() 
Out[27]: 
0  10 
1  100 
2 1000 
3 1000 
Name: val, dtype: int64 
0

Funktion round negative Werte für Fälle akzeptiert, in dem Sie Präzision links von dem Komma angeben möchten:

dataframe.columnName.round(-3) 

Beispiel:

>>> pd.Series([1, 500, 500.1, 999, 1500, 1501, 946546]).round(-3) 
0   0.0 
1   0.0 
2  1000.0 
3  1000.0 
4  2000.0 
5  2000.0 
6 947000.0 
dtype: float64 
0

Ein weiterer interessanter "Hack" ist das: Nehmen wir an, Sie möchten auf die nächsten 100s abrunden. Sie können 50 hinzufügen, dann durch 100 teilen, konvertieren, auf ganzzahlige multiplizieren zurück von 100.

df = pd.DataFrame({'val':[1005,1299,1301,4109]}) 
df.val.round(-2) # Proper way 
((df.val+50)/100).astype(int)*100 # Hack 

Gibt Ihnen diese, je nach Wunsch:

[1000, 1300, 1300, 4100]