python 中 pandas 系列的地板或天花板?

问题描述 投票:0回答:6

我有一个熊猫系列

series
。如果我想获得元素级下限或上限,是否有内置方法或者我是否必须编写函数并使用 apply?我问是因为数据很大所以我很看重效率。此外,还没有针对 Pandas 包提出这个问题。

python pandas series floor ceil
6个回答
150
投票

您可以使用 NumPy 的内置方法来执行此操作:

np.ceil(series)
np.floor(series)

两者都返回一个 Series 对象(而不是数组),因此索引信息被保留。


37
投票

我是OP,但我尝试了这个并且有效:

np.floor(series)

23
投票

更新:这个答案是错误的,不要这样做

说明:将

Series.apply()
与本机向量化 Numpy 函数一起使用使得 在大多数情况下没有意义,因为它将在 Python 循环中运行 Numpy 函数,从而导致性能更差。你最好使用
np.floor(series)
直接,正如其他几个答案所建议的那样。

你可以使用 NumPy 的底层来做类似的事情,例如,使用

dataframe
:

floored_data = data.apply(np.floor)

现在无法测试它,但实际可行的解决方案可能离它不远了。


19
投票

使用

pd.Series.clip
,您可以通过
clip(lower=x)
设置地板或通过
clip(upper=x)
设置天花板:

s = pd.Series([-1, 0, -5, 3])
    
print(s.clip(lower=0))
# 0    0
# 1    0
# 2    0
# 3    3
# dtype: int64
    
print(s.clip(upper=0))
# 0   -1
# 1    0
# 2   -5
# 3    0
# dtype: int64

pd.Series.clip
允许通用功能,例如同时铺设天花板并铺设地板,例如
s.clip(-1, 1)

注意:答案最初提到

clip_lower
/
clip_upper
,在 pandas 1.0.0 中被删除


7
投票

固定的答案已经是最快的了。这里我提供了一些使用纯 pandas 做天花板和地板的替代方案,并将其与 numpy 方法进行比较。

series = pd.Series(np.random.normal(100,20,1000000))

地板

%timeit np.floor(series) # 1.65 ms ± 18.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit series.astype(int) # 2.2 ms ± 131 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit (series-0.5).round(0) # 3.1 ms ± 47 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit round(series-0.5,0) # 2.83 ms ± 60.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

为什么 astype int 有效?因为在Python中,当转换为整数时,它总是会被地板。

天花板

%timeit np.ceil(series) # 1.67 ms ± 21 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit (series+0.5).round(0) # 3.15 ms ± 46.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit round(series+0.5,0) # 2.99 ms ± 103 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

是的,只需使用 numpy 函数即可。


0
投票

您可以在不使用 numpy 的情况下轻松计算楼层,通过调用:

series.astype(int)

此类型到 int 的转换使用了下限运算符。

© www.soinside.com 2019 - 2024. All rights reserved.