如何舍入并将最小值和最大值应用于 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 = 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.9
,pandas 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)"
)
我正在为如何清理数据框而苦恼。我想做的是截断所有项目(即 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 = 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.9
,pandas 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)"
)