我正在将一个函数(例如字母频率)应用于由一列固定长度的单词组成的 dask_cudf 数据帧。
我正在尝试合并输出或将输出附加到原始数据帧中,但我一直在绞尽脑汁寻找一种无需计算即可实现此目的的方法。输出生成得非常快,但是因为我需要进行某种转换,所以时间增加了 1000 倍。
我在配备 3060 GeForce GPU 的 Linux Mint 盒子上使用 RAPIDS 24.10。
import itertools
import re
import os, sys
import tempfile
import numpy as np
import pandas as pd
import collections
import numpy.ma as ma
from collections import defaultdict
from itertools import chain
import tracemalloc
import threading
import tqdm
import concurrent.futures
import multiprocessing as mp
import dask.dataframe as dd
import dask.array as da
import dask.bag as db
import dask.delayed as dl
import pyarrow as pa
import pyarrow.parquet as pq
import cupy, cudf
import cudf.pandas
cudf.pandas.install()
import dask
dask.config.set({"array.backend": "cupy"})
dask.config.set({"dataframe.backend": "cudf"})
import dask_cudf
def freq(row):
return len(set(row[0]))/len(row[0])
words = ['password','username','database','function','variable','algorithm','protocol','callback','unittest','pipeline']
a = dask_cudf.from_cudf(cudf.DataFrame(data=words, columns=['words']).to_pandas(nullable=True))
#a.compute()
b = a.apply(freq, axis=1, meta=pd.DataFrame({'selfhyb': [0]}))
#b.compute()
我的期望是我可以找到一种方法将 a 和 b 合并为一个,或者简单地用 b 的输出为 a 分配一个新列。但如果不需要compute(),我就没有取得任何成功,这变得超级慢且毫无意义。
我的困惑在于b的格式,它显示为:
<class 'dask_expr._collection.DataFrame'>
这似乎既不是一个 cudf.Series,也不是一个真正的 cudf.Dataframe,所以我不确定如何在无需计算()的情况下强制执行此操作。两者都是“索引”的,我认为它们应该能够链接起来以允许下游过滤等等等等
这是唯一有效的方法:
结果 = dask_cudf.concat([a, b], axis=1)