Pandas系列成对最大值

5
我想在pandas Series的每个元素和0之间找到最大值。我的粗略解决方案如下:
import numpy as np
import pandas as pd
np.random.seed(1)

series = pd.Series(np.random.randn(100))
pmax = pd.Series([])
for i in range(len(series)):
    pmax[i] = max(series[i],0)

我需要在大量序列上运行此代码,但是这个解决方案太慢了。是否有一种向量化的方法来实现相同的结果?

2个回答

7

我正在寻找一个解决python实现Rs pmax()的方法,偶然发现了numpy的maximum()函数,它完全可以实现pmax()的功能:

pmax(5,c(1,2,6))
[1] 5 5 6

并且:

>>> import numpy as np
>>> np.maximum(5, [1,2,6])
array([5, 5, 6])

3

安装

s = pd.Series([1,2,3,-1,-2,3,4,-5])

使用填充值为0的mask

s.mask(s<0, 0)

0    1
1    2
2    3
3    0
4    0
5    3
6    4
7    0
dtype: int64

使用没有上限的np.clip

np.clip(s, 0, None)

@Coldspeed建议使用pd.Series.clip_lower

s.clip_lower(0)

时间

In [204]: %%timeit
     ...: pmax = pd.Series([])
     ...: for i in range(len(series)):
     ...:     pmax[i] = max(series[i],0)
     ...:
81.2 ms ± 4.06 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [205]: %timeit series.mask(series<0, 0)
626 µs ± 30.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [206]: %timeit np.clip(series, 0, None)
124 µs ± 3.44 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [209]: %timeit series.clip_lower(0)
97.2 µs ± 3.15 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

1
由于您仅裁剪了较低的范围,因此您还可以使用 series.clip_lower(0) - cs95
那似乎是最快的方法。谢谢你的提示! - user3483203

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接