我有两个熊猫系列:
s1
具有潜在一个非常大的数量的行和一些NaN
和s2
(其是在一个数据帧(列df
)仅具有20行。
这两个系列的索引有所不同。
s1:
id
1 4.5
2 15.0
3 13.0
4 14.0
5 18.0
6 15.0
7 13.0
8 14.0
9 NaN
10 NaN
11 NaN
12 18.0
13 NaN
14 NaN
15 NaN
df:
col1 s2
0 20.0 0.0
1 19.0 4.5
2 18.0 5.0
3 17.0 6.0
4 16.0 7.0
5 15.0 8.0
6 14.0 9.0
7 13.0 10.0
8 12.0 11.0
9 11.0 12.0
10 10.0 13.0
11 9.0 15.0
12 8.0 16.0
13 7.0 18.0
14 6.0 20.0
15 5.0 22.0
16 4.0 24.0
17 3.0 26.0
18 2.0 28.0
19 1.0 100.0
对于每一个id
的s1
我想检索的值col1
在所述第一元件s2
小于或等于id
。
即因为id 1
我们拥有s1 = 4.5
小于或等于df.s2 = 4.5
的值,因此我想取回这个值19
。因此,id=2
在s1
我需要检索的值9
在df.col1
这是我目前的解决方案。我想知道是否有更好的方法(更快,也许是熊猫函数?)来获得相同的结果:
output = [min(df[df['s2'].le(element)].col1, default = np.NaN) for element in s1]
[19.0,
9.0,
10.0,
10.0,
7.0,
9.0,
10.0,
10.0,
nan,
nan,
nan,
7.0,
nan,
nan,
nan]
想法是使用numpy并将Series
2d数组的每个值与列中的每个值进行比较,然后传递给numpy.where
,NaN
如果不匹配则设置,最后使用numpy.nanmean
:
m = df['s2'].to_numpy() <= s1.to_numpy()[:, None]
a = np.nanmin(np.where(m, df['col1'], np.nan), axis=1)
print (a)
[19. 9. 10. 10. 7. 9. 10. 10. nan nan nan 7. nan nan nan]
性能:原始样品
In [63]: %%timeit
...: [min(df[df['s2'].le(element)].col1, default = np.NaN) for element in s1]
...:
...:
9.21 ms ± 305 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [64]: %%timeit
...: m = df['s2'].to_numpy() <= s1.to_numpy()[:, None]
...: a = np.nanmin(np.where(m, df['col1'], np.nan), axis=1)
72.4 µs ± 870 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
大数据100倍:
#2k rows
df = pd.concat([df] * 100, ignore_index=True)
#1.5k rows
s1 = pd.concat([s1] * 100, ignore_index=True)
In [68]: %%timeit
...: [min(df[df['s2'].le(element)].col1, default = np.NaN) for element in s1]
...:
...:
1.12 s ± 17.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [69]: %%timeit
...: m = df['s2'].to_numpy() <= s1.to_numpy()[:, None]
...: a = np.nanmin(np.where(m, df['col1'], np.nan), axis=1)
34.2 ms ± 305 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句