首页 > 解决方案 > 给定值列表的 Pandas 自定义舍入

问题描述

我正在尝试找到一种聪明、直接的方法来在给定一组值的情况下舍入一列整数数据。这是我的示例数据

import pandas as pd

df = pd.Series([11,16,21, 125])

假设我想使用一个名为custom_round. 这样,当应用四舍五入时,原始系列中的每个值都被四舍五入到最接近的值,或者如果 已经大于最大值,则将它们降低到该最大值。

rounding_logic = pd.Series([15, 20, 100])

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

之后 df 现在是pd.Series([15, 20, 100, 100]).

我可以想到一些非常低效和丑陋的 if else 语句,但我怀疑必须有一个更简单的方法。我已经看到自定义舍入答案,其目标是舍入到最接近的 n,给定一些基数,例如Pandas 舍入到最接近的“n”,但没有解决我的特殊情况。

标签: pythonpandas

解决方案


您可以使用以下功能cut

df = pd.Series([11,16,21, 125])

rounding_logic = pd.Series([15, 20, 100])
labels = rounding_logic.tolist()
rounding_logic = pd.Series([-np.inf]).append(rounding_logic) # add infinity as leftmost edge

pd.cut(df, rounding_logic, labels=labels).fillna(rounding_logic.iloc[-1])
# get bins, assign labels and fill all values that greater than 100 with 100

输出:

0     15
1     20
2    100
3    100
dtype: category
Categories (3, int64): [15 < 20 < 100]

 

推荐阅读