通过 GPU 内核并行化 Pandas df.iterrows()

问题描述

我编写了一个 python 程序,在该程序中,我需要检查给定值是否在给定数据集的列中。为此,我需要遍历每一行并检查每一行中列的相等性。这需要很多时间,因此我想在 GPU 中运行它。我有 CUDA C/C++ 的经验,但没有 PyCuda 的并行化经验。谁能帮我解决这个问题?

C:\Program Files>javac HelloWorld.java
HelloWorld.java:1: error: error while writing HelloWorld: C:\Program Files\HelloWorld.class
public class HelloWorld {
       ^
1 error

C:\Program Files> 

注意:这是我程序的一部分。我只想并行化这个 部分使用 GPU。

提前致谢。

解决方法

这种方法的动机是为了摆脱 df.iterrows 范式,因为它的速度相对较低。虽然有可能拆分成一个 dask 数据帧并执行某种并行的 apply 函数,但我认为由于 Numpy/Pandas 向量化操作的性能优势(如下所示),向量化方法是可以接受的.

enter image description here


我解释这段代码的方式基本上是“在 prop 列中,如果变量 temp 在该列的列表中,则将 prop 列设置为 's' ”。

for index,row in df.iterrows():
    s1 = set(df.iloc[index]['prop'])
    if temp in s1:
        df.iat[index,df.columns.get_loc('prop')] = 's'

我构建了一个测试数据框:

df = pd.DataFrame({'temp': ['re'] * 7,'prop': [['re','a'],['ad','ed'],['see','contra'],['loc','idx'],['reader','pandas'],['alpha','omega'],['a','z']]})

然后爆炸以获取 tempprop 子列表元素的所有可能组合。在每个结果组中,我使用 any 进行聚合,并将其用作掩码键,用 prop 替换相应的 's' 索引。

>>> df['result'] = df['prop'].explode().eq(df['temp']).reset_index().groupby('index').any()
>>> df['prop'] = df['prop'].mask(df['result'],'s')
>>> # df['prop'] = np.where(df['result'],'s',df['prop'])  # identical operation

  temp              prop  result
0   re                 s    True
1   re          [ad,ed]   False
2   re     [see,contra]   False
3   re        [loc,idx]   False
4   re  [reader,pandas]   False
5   re    [alpha,omega]   False
6   re            [a,z]   False

此答案对于 temp 列中的逐行更改以及 prop 子列表中(相对任意)数量的元素是稳健的。也就是说,如果您的数据很大,您应该首先进行子集化以尽量减少内存使用。仅选择适用的列然后执行。

另请注意,df['prop'].explode().eq(df['temp']) 有效,因为 temp 列在索引上广播到展开的 prop 列。