首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Dask-Dataframe列中的唯一值数

Dask-Dataframe列中的唯一值数
EN

Stack Overflow用户
提问于 2021-11-11 13:05:25
回答 3查看 817关注 0票数 0

我有一个从csv文件读取的Dataframe文件,有大约100万条记录和120个特性/列,我想在每一列中计算唯一值的数量。我可以使用for -循环分别为每一列执行此操作:

代码语言:javascript
复制
from dask import dataframe as dd
dask_df = dd.read_csv("train.csv")
for column in dask_df.columns:
     print(dask_df[col].nunique().compute())

但是每次迭代时的计算都是非常昂贵的(每个工作人员拥有2GB的内存和2个vcore,每个工作人员有3个节点集群,每个工作人员需要大约40分钟的计算时间),那么是否有一种方法可以在数据帧的每一列得到唯一的值呢?我尝试过dask_df.describe() api,但这只为字符串类型提供了唯一的值。感谢您的任何帮助,谢谢!

EN

回答 3

Stack Overflow用户

发布于 2021-11-17 22:31:35

下面是另一种解决方法,即每一列的唯一值都是一次计算的,这为优化提供了更多的机会:

代码语言:javascript
复制
import random
import pandas
import dask
import dask.dataframe as dd

df = pandas.DataFrame({
    "x": [random.randint(0,100) for _ in range(100)],
    "y": [random.randint(0,100) for _ in range(100)],
    "z": [random.randint(0,100) for _ in range(100)],
})
ddf = dd.from_pandas(df, npartitions=10)

unique = {
    name: ddf[name].nunique()
    for name in ddf.columns
}

# traverse=True is default, but being explicit that we are traversing the dict for dask objects
dask.compute(unique, traverse=True)
票数 1
EN

Stack Overflow用户

发布于 2021-11-11 17:03:57

我不知道这是否是最快的解决方案,但您可以使用.melt()解除数据透视列,然后在变量列上使用.groupby()来计算每个组中的唯一值,以便在每列解决方案的列上获得显著的性能改进:

代码语言:javascript
复制
dd.read_csv('test.csv').melt().groupby('variable')['value'].nunique().compute()

让我们生成一些随机整数数据并保存为csv:

代码语言:javascript
复制
import numpy as np
import pandas as pd
from dask import dataframe as dd

nrows = 10000
ncols = 120

rng = np.random.default_rng(seed=1)
random_data = rng.integers(low=0, high=nrows/2, size=(nrows,ncols))
pd.DataFrame(data=random_data).add_prefix('col_').to_csv('test.csv', index=False)

我们使用以下两个函数进行绩效评估:

代码语言:javascript
复制
def nunique_per_column():
    dask_df = dd.read_csv('test.csv')
    counts = []
    for col in dask_df.columns:
          counts.append(dask_df[col].nunique().compute())
    return pd.Series(counts, index=dask_df.columns)

def melt_groupby_nunique():
    return dd.read_csv('test.csv').melt().groupby('variable')['value'].nunique().compute()

首先,检查两个函数是否使用以下方法计算相同的结果:

代码语言:javascript
复制
pd.testing.assert_series_equal(nunique_per_column().sort_index(),
                               melt_groupby_nunique().sort_index(),
                               check_names=False)

函数和示例数据上的%timeit在我的机器上产生了以下输出:

代码语言:javascript
复制
%timeit nunique_per_column()
17.5 s ± 216 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit melt_groupby_nunique()
1.78 s ± 576 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
票数 0
EN

Stack Overflow用户

发布于 2022-01-18 18:46:33

@Mohamed 2022.01.0dask.DataFrame.nunique()已成为实施

代码语言:javascript
复制
import random
import pandas
import dask.dataframe as dd

df = pandas.DataFrame({
    "x": [random.randint(0,100) for _ in range(100)],
    "y": [random.randint(0,100) for _ in range(100)],
    "z": [random.randint(0,100) for _ in range(100)],
})
ddf = dd.from_pandas(df, npartitions=10)

ddf.nunique().compute()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69928786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档