我不知道这是否是最快的解决方案,但您可以使用 .melt() 取消透视您的数据框列,然后在变量列上使用 .groupby() 来计算每个组中的唯一值以获得显着性每列解决方案的性能改进:
dd.read_csv('test.csv').melt().groupby('variable')['value'].nunique().compute()
让我们生成一些随机整数数据并保存为 csv:
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)
我们使用以下两个函数进行性能评估:
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()
首先检查两个函数是否计算相同的结果:
pd.testing.assert_series_equal(nunique_per_column().sort_index(),
melt_groupby_nunique().sort_index(),
check_names=False)
%timeit 函数和示例数据在我的机器上产生以下输出:
%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)