从pandas DataFram中删除少于K个连续的nan

2024-10-06 12:15:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理时间序列数据。从小于或等于阈值的连续列中删除nansi是一个问题。我试着查看一些链接,比如:

Identifying consecutive NaN's with pandas:标识连续的nan出现的位置和计数。在

Pandas: run length of NaN holes:输出nan的运行长度编码

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

我发现了一个类似的解决方案,但在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,我的输出应该是:

^{pr2}$

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


Tags: 数据pandas链接with时间序列阈值nan
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

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

  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)步骤。在

相关问题 更多 >