在Dask中有效地删除行

时间:2019-07-14 22:21:02

标签: python dataframe dask

我正在尝试在简单的数据帧上删除null值,documentaton中的示例适用于以下列:

import dask.dataframe as dd
df = dd.read_csv("test.csv",assume_missing=True)
df.dropna(how='all', subset=None, thresh=None).compute()

但是,如果我尝试指定轴0以便按行过滤,则会出现此错误:

import dask.dataframe as dd
df = dd.read_csv("test.csv",assume_missing=True)
df.dropna(how='all', subset=None, thresh=None,axis=0).compute()

文档也说:

axis:{0 or ‘index’, 1 or ‘columns’}, default 0 (Not supported in Dask)

因此,我将其写为一个解决方法:

df = dd.read_csv("test.csv",assume_missing=True)
filter_ = ~(df.isnull().all(axis=1).reset_index()[0])
df.loc[filter_].compute()

但是它看起来不是pythonic。 另外,我正在重置索引,据我所知,这是一项效率低下的操作。

1 个答案:

答案 0 :(得分:1)

您已经注意到,从2.2.0版开始,Dask的dropna()不支持axis参数。要删除列,您必须“手动”检查该库是否包含Nan s,如果有,则将其删除:

how = 'any'

df.drop([c for c in df.columns if df[c].isna().any().compute()], axis = 1)

how = 'all'

df.drop([c for c in df.columns if df[c].isna().all().compute()], axis = 1)

尽管示例中未明确列出,但isna()max()一样是trivially parallelizable operation,因此效率很高。