[英]pandas series pairwise maximum
我想找到熊貓系列中每個元素和 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)
我需要在大量系列上運行這個,這個解決方案太慢了。 是否有矢量化方法來實現相同的結果?
我正在尋找 Rs pmax()
的 python 實現的解決方案,並偶然發現了 numpys 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])
設置
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.