gpt4 book ai didi

python - Pandas 在两个系列之间进行元素比较的最佳方法

转载 作者:行者123 更新时间:2023-12-04 01:26:48 25 4
gpt4 key购买 nike

我有两个 Pandas 系列:

s1 可能有非常多的行和一些 NaNs2(它是数据帧中的一列( 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

对于 s1 的每个 id 我想检索 s2 中第一个元素的 col1 的值小于或等于 id

即对于 id 1,我们有 s1 = 4.5,它小于或等于 df.s2 = 4.5,因此我想检索值 19。因此,对于 s1 中的 id=2,我需要在 df.col1

中检索值 9 >

这是我目前的解决方案。我想知道是否有更好(更快,也许是 pandas 函数?)的方法来获得相同的结果:

      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 的每个值进行比较,然后传递给 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)

关于python - Pandas 在两个系列之间进行元素比较的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61748964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com