【问题标题】:Remove lesser than K consecutive NaNs from pandas DataFrame从 pandas DataFrame 中删除少于 K 个连续的 NaN
【发布时间】:2023-03-06 06:02:01
【问题描述】:

我正在处理时间序列数据。从数据框列中删除小于或等于阈值的连续 NaN 时,我遇到了问题。我尝试查看一些链接,例如:

Identifying consecutive NaN's with pandas :识别连续 NaN 的位置以及计数值。

Pandas: run length of NaN holes:输出运行长度编码为 NaNs

这条车道上还有很多其他的,但没有一个真正告诉我们如何在识别后将它们移除。

我找到了一个类似的解决方案,但在 R 中: How to remove more than 2 consecutive NA's in a column?

我想要 Python 中的解决方案。

下面是例子:

这是我的数据框列:

            a
    0   36.45
    1   35.45
    2     NaN
    3     NaN
    4     NaN
    5   37.21
    6   35.63
    7   36.45
    8   34.65
    9   31.45
    10    NaN
    11    NaN
    12  36.71
    13  35.55
    14    NaN
    15    NaN
    16    NaN
    17    NaN
    18  37.71

如果 k = 3,我的输出应该是:

            a
    0   36.45
    1   35.45
    2   37.21
    3   35.63
    4   36.45
    5   34.65
    6   31.45
    7   36.71
    8   35.55
    9     NaN
    10    NaN
    11    NaN
    12    NaN
    13  37.71

我如何才能删除小于或等于某个阈值 (k) 的连续 NaN。

【问题讨论】:

  • 我只是在试验一个包含 100 列和每列 160000 个值的数据集时分析解决方案。一旦我决定哪一个对如此大的数据集有效,我会接受答案。
  • 太棒了,感谢更新。

标签: python pandas nan


【解决方案1】:

有几种方法,但我是这样做的:

  1. 使用简洁的cumsum 技巧确定连续数字组
  2. 使用groupby + transform 确定每个组的大小
  3. 识别阈值内的 NaN 组
  4. 使用布尔索引过滤掉它们。

k = 3 
i = df.a.isnull()
m = ~(df.groupby(i.ne(i.shift()).cumsum().values).a.transform('size').le(k) & i)

df[m]

a
0   36.45
1   35.45
5   37.21
6   35.63
7   36.45
8   34.65
9   31.45
12  36.71
13  35.55
14    NaN
15    NaN
16    NaN
17    NaN
18  37.71

如果您想要一个单调递增的整数索引,您可以在最后执行df = df[m]; df.reset_index(drop=True) 步骤。

【讨论】:

  • 谢谢它工作得很好!!。但是有点难以理解为什么要进行轮班操作。我也不太熟悉变换功能。很高兴学习。
  • @AvaniSharma 它是我前面提到的 cumsum 卡车的一部分,用于查找连续的数字组。
  • 嘿,谢谢!!。我终于用了你的答案:)
【解决方案2】:

您可以创建一个指标列来计算连续的 nan。

k = 3
(
df.groupby(pd.notna(df.a).cumsum())
.apply(lambda x: x.dropna() if pd.isna(x.a).sum() <= k else x)
.reset_index(drop=True)
)

Out[375]: 
        a
0   36.45
1   35.45
2   37.21
3   35.63
4   36.45
5   34.65
6   31.45
7   36.71
8   35.55
9     NaN
10    NaN
11    NaN
12    NaN
13  37.71

【讨论】:

  • 嘿,这对于大约 100 列 160000 个值的列来说似乎太慢了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 2017-09-16
  • 1970-01-01
  • 2018-05-01
  • 2020-02-10
相关资源
最近更新 更多