如何制作小数部分舍入过滤器,使用 python pandas Dataframe apply 方法

How to make decimal part rounding filter, using python pandas Dataframe apply method

我想用 pandas Dataframe 制作十进制过滤器。
过滤器将上限和下限它们的小数部分。

像这样
阈值为 0.3 和 0.7
0.75 -> 1
1.99 -> 2
9.13 -> 9
326.2 -> 326
34.5 -> 34.5
68.4 -> 68.4

import pandas as pd

def threshold_function(df):
    print(df)
    decimal_part = df - np.floor(df)
    if (decimal_part <= 0.3):
        return np.floor(df)
    elif (0.7 <= decimal_part):
        return np.floor(df) + 1
    return df

example = pd.DataFrame([0.75,1.99,9.13,326.2,34.5])
filtered_df = example.apply(threshold_function)

我不知道为什么数据框应用方法不起作用。

The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

谢谢:)

带有np.modf + np.select的选项:

decimal, base = np.modf(example)
filtered_df = pd.DataFrame(np.select(
    [decimal <= 0.3, decimal >= 0.7],
    [base, base + 1],
    default=example
), columns=example.columns, index=example.index)

Example:

example = pd.DataFrame([[0.75, 1.99, 9.13, 326.2, 34.5],
                        [0.85, 2.65, 10.19, 42.2, 61.65]])
      0     1      2      3      4
0  0.75  1.99   9.13  326.2  34.50
1  0.85  2.65  10.19   42.2  61.65

filtered_df:

     0     1     2      3      4
0  1.0  2.00   9.0  326.0  34.50
1  1.0  2.65  10.0   42.0  61.65

或通过 applymap 进行修订:

def threshold_function(v):
    decimal_part = v - np.floor(v)
    if decimal_part <= 0.3:
        return np.floor(v)
    elif 0.7 <= decimal_part:
        return np.ceil(v)
    return v


example = pd.DataFrame([[0.75, 1.99, 9.13, 326.2, 34.5],
                        [0.85, 2.65, 10.19, 42.2, 61.65]])
filtered_df = example.applymap(threshold_function)

example

      0     1      2      3      4
0  0.75  1.99   9.13  326.2  34.50
1  0.85  2.65  10.19   42.2  61.65

filtered_df:

     0     1     2      3      4
0  1.0  2.00   9.0  326.0  34.50
1  1.0  2.65  10.0   42.0  61.65