熊猫在两个系列之间进行逐元素比较的最佳方法

吉欧:

我有两个熊猫系列:

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

对于每一个ids1我想检索的值col1在所述第一元件s2小于或等于id

即因为id 1我们拥有s1 = 4.5小于或等于df.s2 = 4.5的值,因此我想取回这个值19因此,id=2s1我需要检索的值9df.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并将Series2d数组的每个值与列中的每个值进行比较,然后传递给numpy.whereNaN如果不匹配设置,最后使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

两个熊猫数据框的逐元素比较

逐元素比较两个向量或字符串的最佳方法是什么?

两个熊猫数据帧的条件逐元素乘法

如何比较两个熊猫系列的两行?

如何对两个矩阵进行逐元素求和?

比较两个熊猫系列的浮点近似相等性?

比较两个熊猫系列时出现ValueError

在熊猫中找到两个系列之间的交点

两个熊猫系列之间的匹配ID

如何找到两个熊猫列之间的最佳匹配?

当任何两个元素之间的比较可能不明确时,对列表进行排序?

如何在两个 NumPy 数组之间进行元素比较

如何比较两个不同列之间的熊猫值?

使用键合并两个熊猫数据框并对其进行分割的最佳方法

熊猫:有没有一种方法可以比较两个系列,并找到一个系列中最近的元素,而不能找到另一个?

Qt中两个窗口之间进行通讯的最佳方法是什么

通过比较两个系列来创建逻辑上的熊猫系列

在其他系列的两个索引之间创建一个新的熊猫系列

比较两个系列时,如何基于一个系列进行过滤?

比较两个相似数组之间的元素

对切片中的每两个元素进行分组的最佳方法?

linux +在两个文件夹之间进行比较

Git:在两个隐藏之间进行比较

两个DatetimeIndex之间的熊猫元素差异

比较两个复杂对象的最佳方法

比较两个二维数组的最佳方法

使用两个比较器的最佳方法是什么?

比较两个不同枚举的最佳方法是什么?

比较两个不同大小的numpy数组的最佳方法