如何在dsak cudf dataframe中创建唯一的id列,到目前为止,我使用的是以下技术,但是如果我将数据增加到超过10 me,则会导致内存错误。
def unique_id(df):
rag = cupy.arrange(len(df))
df['unique_id']=rag
return df
part = data.npartitions
data = data.repartitions(npartitions=1)
cols_meta={c:str(data[c].dtype) for c in data.columns}
data = data.map_partitions(lambda df:unique_id(df), meta={**cols_meta,'unique_id'})
data = data.repartitions(npartitions=part)
如果有任何其他方式,或任何修改代码,请建议。谢谢你的帮助
发布于 2021-05-19 13:17:36
I之所以这样做是因为希望按顺序创建I,直到长度数据。
其他建议可能会奏效。但是,最简单的方法之一是创建一个值为1的临时列并使用cumsum
,如下所示:
import cudf
import dask_cudf
df = cudf.DataFrame({
"a": ["dog"]*10
})
ddf = dask_cudf.from_cudf(df, 3)
ddf["temp"] = 1
ddf["monotonic_id"] = ddf["temp"].cumsum()
del ddf["temp"]
print(ddf.partitions[2].compute())
a monotonic_id
8 dog 9
9 dog 10
正如预期的那样,分区索引2中的两行具有If 9和10。如果需要索引从0开始,可以减去1。
发布于 2021-05-19 08:43:22
您遇到内存错误的原因是以下步骤:
data = data.repartitions(npartitions=1)
通过使用单个分区,您将强制单个工作人员上的所有数据,这将在数据集的大小增加时导致内存问题。您想要做的是在维护每个分区的同时分配一个唯一的标识符,请参阅this answer。
https://stackoverflow.com/questions/67599701
复制相似问题