熊猫四舍五入到最近的“n”

时间:2016-11-02 03:29:51

标签: python pandas

数字系列有一个很好的舍入方法,可以舍入为10的幂,例如

>>> pd.Series([11,16,21]).round(-1)
0    10
1    20
2    20
dtype: int64

是否有一个相当不错的语法用于舍入到最接近的5(或其他10的非幂)?我有点希望round可以取非整数值吗?

2 个答案:

答案 0 :(得分:11)

您可以使用自定义舍入功能并将apply添加到系列中。

import pandas as pd

def custom_round(x, base=5):
    return int(base * round(float(x)/base))

df = pd.Series([11,16,21]).apply(lambda x: custom_round(x, base=5))

现在您只需调整base即可获得所需的最接近的值。

几个例子:

基数= 5:

0    10
1    15
2    20
dtype: int64

基数= 7

0    14
1    14
2    21
dtype: int64

基数= 3

0    12
1    15
2    21
dtype: int64

您也可以完成非整数值的目标。

def custom_round(x, base=5):
    return base * round(float(x)/base)

df = pd.Series([11.35,16.91,21.12]).apply(lambda x: custom_round(x, base=.05))

通过舍入到最接近的0.05,您将得到这些结果(注意我在本例中略微修改了您的系列):

0    11.35
1    16.90
2    21.10
dtype: float64

如果您保留原始系列整数,则此apply会将您的系列更改为float值:

答案 1 :(得分:0)

我想我可以这样做:

def round_down_to_nearest(self, n):
    return (self // n) * n

pd.Series.round_down_to_nearest = round_down_to_nearest