如何舍入并将最小值和最大值应用于 Pandas Dataframe 中的所有值

How to round and apply min and max to all values in Pandas Dataframe

我正在为如何清理数据框而苦恼。我想做的是截断所有项目(即 floor()),对于低于或高于 min/max 的任何项目,替换为适用的最小值或最大值。例如。对于这个数据框:

如果我的最小值和最大值分别为 1 和 5,则 1.2 将截断为 1,9.6 将映射为 5,-1.2 将映射为 1,3.5 将截断为 3:

除了使用 iterrows() 的暴力迭代之外,我还没有能够让它工作。很多关于寻找最小值和最大值的内容,但没有关于应用a最小值和最大值的内容。

请问大家有什么建议吗?谢谢。

可以使用applymap,如:

from numpy import floor

MAX, MIN = 5, 1

df = df.applymap(lambda val: MAX if val > MAX else int(floor(val)) if val > MIN else MIN)

您可以使用df.clip and cast to int

df = pd.DataFrame({
    'A':[1.2, 3.5],
    'B':[9.6, -1.2]
})
df.clip(1,5).astype('int')

输出:

   A  B
0  1  5
1  3  1

如果你想要 float 值,你可以 floor 带有 np.floor 的数据框,这很方便 returns 一个 pd.dataframe 然后 clip .

import numpy as np

np.floor(df)

输出:

     A    B
0  1.0  9.0
1  3.0 -2.0
np.floor(df).clip(1,5)

输出:

     A    B
0  1.0  5.0
1  3.0  1.0

微基准测试

python 3.6.9pandas 1.1.5 在 google colab 实例上

结果:

用于基准测试的代码

import pandas as pd
import numpy as np
import perfplot

def make_data(n=100):
    return pd.DataFrame(
        np.random.uniform(-1.2, 9.6, (n,10))
    )

def clip_castint(df):
    return df.clip(1,5).astype('int')

def clip_npfloor(df):
    return np.floor(df.clip(1,5))

from numpy import floor
def applymap(df):
    MAX, MIN = 5, 1
    return df.applymap(lambda val: MAX if val > MAX else int(floor(val)) if val > MIN else MIN)

perfplot.show(
    setup=make_data,
    kernels=[clip_castint, clip_npfloor, applymap],
    n_range=[2**k for k in range(10,22)],
    xlabel="df(rows, 10)"
)