我有一个熊猫系列
series
。如果我想获得元素级下限或上限,是否有内置方法或者我是否必须编写函数并使用 apply?我问是因为数据很大所以我很看重效率。此外,还没有针对 Pandas 包提出这个问题。
您可以使用 NumPy 的内置方法来执行此操作:
np.ceil(series)
或 np.floor(series)
。
两者都返回一个 Series 对象(而不是数组),因此索引信息被保留。
我是OP,但我尝试了这个并且有效:
np.floor(series)
更新:这个答案是错误的,不要这样做
说明:将
与本机向量化 Numpy 函数一起使用使得 在大多数情况下没有意义,因为它将在 Python 循环中运行 Numpy 函数,从而导致性能更差。你最好使用Series.apply()
直接,正如其他几个答案所建议的那样。np.floor(series)
你可以使用 NumPy 的底层来做类似的事情,例如,使用
dataframe
:
floored_data = data.apply(np.floor)
现在无法测试它,但实际可行的解决方案可能离它不远了。
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 中被删除。
固定的答案已经是最快的了。这里我提供了一些使用纯 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 函数即可。
您可以在不使用 numpy 的情况下轻松计算楼层,通过调用:
series.astype(int)
此类型到 int 的转换使用了下限运算符。