python - 如何删除 Pandas 中连续的坏数据点

标签 python pandas time-series sensors

我有一个 Pandas 数据框,如下所示:

import pandas as pd
import numpy as np
df = pd.DataFrame({"Dummy_Var": [1]*12, 
                   "B": [6, 143.3, 143.3, 143.3, 3, 4, 93.9, 93.9, 93.9, 2, 2, 7],
                   "C": [4.1, 23.2, 23.2, 23.2, 4.3, 2.5, 7.8, 7.8, 2, 7, 7, 7]})


    B       C       Dummy_Var
0   6.0     4.1     1
1   143.3   23.2    1
2   143.3   23.2    1
3   143.3   23.2    1
4   3.0     4.3     1
5   4.0     2.5     1
6   93.9    7.8     1
7   93.9    7.8     1
8   93.9    2.0     1
9   2.0     7.0     1
10  2.0     7.0     1
11  7.0     7.0     1

每当相同的数字连续出现三次或更多次时,该数据应替换为 NAN。所以结果应该是:

    B       C       Dummy_Var
0   6.0     4.1     1
1   NaN     NaN     1
2   NaN     NaN     1
3   NaN     NaN     1
4   3.0     4.3     1
5   4.0     2.5     1
6   NaN     7.8     1
7   NaN     7.8     1
8   NaN     2.0     1
9   2.0     NaN     1
10  2.0     NaN     1
11  7.0     NaN     1

我已经编写了一个函数来执行此操作:

def non_sense_remover(df, examined_columns, allowed_repeating):
    def count_each_group(grp, column):
        grp['Count'] = grp[column].count()
        return grp
    for col in examined_columns:
        sel = df.groupby((df[col] != df[col].shift(1)).cumsum()).apply(count_each_group, column=col)["Count"] > allowed_repeating
        df.loc[sel, col] = np.nan

    return df

df = non_sense_remover(df, ["B", "C"], 2)

然而,我的真实数据框有 200 万行和 18 列!在 2M 行上运行此函数非常非常慢。有没有更有效的方法来做到这一点?我错过了什么吗?提前致谢。

最佳答案

在这种情况下构建 bool 掩码将比基于 apply() 的解决方案更有效,特别是对于大型数据集。这是一种方法:

cols = df[['B', 'C']]
mask = (cols.shift(-1) == cols) & (cols.shift(1) == cols)

df[mask | mask.shift(1).fillna(False) | mask.shift(-1).fillna(False)] = np.nan

编辑:

对于更通用的方法,将长度为 N 的序列替换为 NaN,您可以这样做:

from functools import reduce
from operator import or_, and_

def replace_sequential_duplicates_with_nan(df, N):
    mask = reduce(and_, [cols.shift(i) == cols.shift(i + 1)
                         for i in range(N - 1)])
    full_mask = reduce(or_, [mask.shift(-i).fillna(False)
                             for i in range(N)])
    df[full_mask] = np.nan

关于python - 如何删除 Pandas 中连续的坏数据点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47780904/

相关文章:

python - Elastic Load Balancer 后面的 Elastic beanstalk 实例的 Django ALLOWED_HOSTS 设置

Python、Pandas 匹配数据框并指示列表中的结果

python - 在困惑的能源数据中寻找层次结构

python - 如何访问数据框滚动窗口中的单个元素

python - 使用python仅对时间序列中的非NaN数据求和

python - 即使使用 "fromEncoding=UTF-8"之后,BeautifulSoup 也无法识别 UTF-8 字符

python - 为什么从 WAV 文件导出的 CSV 文件比原始 WAV 文件大得多?

python - TensorFlow 全连接教程 : How are the trained weights used for Eval and Test?

json - 在 Spark DataFrame 中布局 TimeSeries 数据的最佳方式 - Scala

c++ - 时间序列 "forecast"来自 C++ 的 R 包