【问题标题】:Pandas dropna() with many NaNs in all columns and rowsPandas dropna() 在所有列和行中都有许多 NaN
【发布时间】:2021-04-20 23:35:44
【问题描述】:

我有一个包含数百行和列的数据框,并且想要删除所有 NaN。 不幸的是,所有列和所有行中都有 NaN。

df = df.dropna(how = "any") 

因此会导致一个空的数据框。 我使用 while 循环迭代地删除具有阈值的列。

i = 0
while df.isna().sum().sum() != 0:
    i += 0.01
    df= df.dropna(thresh=(i * df.shape[0]), axis= 0)
    df= df.dropna(thresh=(i * df.shape[1]), axis= 1)

这种贪心算法不止一种方式可以确定次优解决方案。
除了编写我自己的线性程序以最大程度地减少删除的数据之外,是否还有我不知道的内置功能? 我的目标是尽可能多地保留数据。

【问题讨论】:

  • 您能解释一下为什么要使用 NaN 删除行和列吗?尤其是为什么保留一些少于给定数量的 NaN 的行和列是可以的?
  • 长期目标是应用回归任务,其中算法无法处理 NaN 值。我也已经尝试过 .fillna(),但由于我的数据集中的 nan 数量众多,我担心潜在的质量损失。关于你的第二个问题。我不太明白你的意思。当 while 循环离开时,没有剩下的 NaN。

标签: python pandas nan


【解决方案1】:

鉴于您在 cmets 中的动力,我可以建议您尝试使用 Pandas 的interpolate() 方法。

df = df.interpolate()

您可以使用method 尝试不同的插值方法。

例如,你可以使用

df = df.interpolate(method='quadratic')

如果您的时间序列数据正在以更快的速度增长。 (请注意,您必须安装 scipy 才能使用 method 参数。)

请参考 Pandas 文档here

此外,您可以尝试使用其他数据插补方法。 部分数据插补方法在this文章中有说明。

特别是,Hot Deck imputation 可能适用于您的情况。

【讨论】:

  • 非常感谢您的努力。这可能会帮助与我处于类似情况的大多数人。不幸的是,我的数据点是不相关的。因此插值不是写法。
  • 对不起,我帮不上忙。但是看看 Hot Deck imputation,它搜索类似的实例(doner)并用 doner 的值替换缺失值。 stackoverflow.com/questions/59541759/…
猜你喜欢
  • 1970-01-01
  • 2016-01-13
  • 2016-02-12
  • 1970-01-01
  • 2017-09-15
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 2019-06-01
相关资源
最近更新 更多