【问题标题】:Dask: Drop NAs on columns?Dask:在列上删除 NA?
【发布时间】:2019-03-21 20:39:40
【问题描述】:

我已尝试应用过滤器来删除具有太多 NA 的列到我的 dask 数据帧:

df.dropna(axis=1, how='all', thresh=round(len(df) * .8))

不幸的是,dask dropna API 似乎与 pandas 略有不同,既不接受 axis 也不接受 threshold。 解决它的一种部分方法是逐列迭代并删除那些常量(无论它们是否填充了 NA,因为我不介意摆脱常量):

    for col in df.columns:
        if len(df[col].unique()) == 1:
            new_df = df.drop(col, axis = 1)

但这并不能让我应用阈值。我可以通过添加手动计算阈值:

elif sum(df[col].isnull().compute()) / len(df[col]) > 0.8:
    new_df = df.drop(col, axis = 1)

但我不确定此时调用 computelen 是否是最佳选择,我很想知道是否有更好的方法来解决这个问题?

【问题讨论】:

    标签: python pandas optimization dask


    【解决方案1】:

    2021 年 8 月 10 日更新:

    现在 Dask 有 axisthreshsubset 参数可能会有所帮助。前面的答案可以改写为:

    df.dropna(subset=columns_to_inspect, thresh=threshold_to_drop_na, axis=1)
    

    旧答案

    你是对的,没有办法使用df.dropna()来做到这一点。

    我建议使用这个等式 df.loc[:,df.isnull().sum()<THRESHOLD]

    【讨论】:

    • 有谁知道“轴”是否已添加到 dask.dataframe.dropna?
    • @ItamarMushkin, It's there now.
    【解决方案2】:

    df.loc[:,df.isnull().sum()

    产生 KeyError,因为您需要计算索引器:

    KeyError: "None of [Index([ True,  True,  True,  True,  True,  True,  True,  True,  True,  True,\n        True,  True,  True, False, False, False, False, False,  True],\n      dtype='object')] are in the [columns]"
    

    结合skibee和Starukhin Yaroslav的答案,我使用:

    df.loc[:, ~df.isna().all().compute()]
    

    如果你想使用一个阈值,你可以使用:

    df.loc[:, ~df.isna().sum().compute() > THRESHOLD]
    

    【讨论】:

      【解决方案3】:

      我们遇到了类似的问题,使用了以下代码:

      for col in df.columns:
          if df[col].isnull().all().compute()=True:
              df = df.drop(col,axis=1) 
      

      【讨论】:

      • 这个操作对于大数据集来说非常慢
      • 你是对的 - 但是如果你需要清理你的列 - 你可能没有任何其他选择
      猜你喜欢
      • 2017-08-15
      • 2013-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      • 2016-07-10
      相关资源
      最近更新 更多