python - 根据它们的类型和值删除 "faulty"行 pandas 数据帧

标签 python pandas

我有一个数据集,其中包含一列日期和时间值以及另一列包含一些测量值( float )。然而,在一些测量过程中,发生了错误,导致了一些奇怪的条目——下面的例子(这些包括 datetime 对象的重复部分,它被解释为字符串、不完整的 datetime 对象、完全随机的字符串、缺失值或另一列超出范围(测量值大多在 10 到 50 之间,但有时我会得到零或类似 100 的值)。

从大型数据集中提取(作为 pandas 数据框加载):

                                      t                          baaa
0                      13/11/2014 23:43                          17.6
1                      13/11/2014 23:44                          17.7
2   2014-11-13 23:452014-11-13 23:45:00                          17.7
3                      13/11/2014 23:46                          17.7
4                      14/11/2014 00:34                            16
5                      14/11/2014 00:35                          15.9
6                                   :00                          17.7
7                      14/11/2014 01:25                          14.9
8                      14/11/2014 01:26                          14.9
9                                     0                            80
10                     14/11/2014 02:16                          14.3
11                     14/11/2014 02:17                          14.3
12                                  NaN  AA550112209500080009002855AA
13                     14/11/2014 03:09                            13
14                      009000B002B55AA                           NaN
15                     14/11/2014 02:19                          14.3
16                     14/11/2014 03:59                          12.6
17                     14/11/2014 04:00                          12.6
18                     14/11/2014 05:41                          11.7
19                     14/11/2014 05:42                          11.7
20                                    0                           140
21                     14/11/2014 04:53                          12.2

所有类型的错误条目示例都在这里。 我怎样才能摆脱错误的线路? 我的想法是做一个 if 循环,设置 't' 列应该是 datetime 对象并且 'baaa' 列应该是 float > 0 和 < 60 的条件。如果条件不满足,我将替换值与 np.nan 并最终使用 dropna 函数。

df['t'] = pd.to_datetime(df['t'], format = '%d/%m/%Y %H:%M', errors='coerce')
df.iloc[:,1] = pd.to_numeric(df.iloc[:,1], errors='coerce')    
for line in df.iloc[:,1]:  
    if (line < 60) & (line > 0):
       line = line
   else:
       line = np.nan
    # not assigning this new value! :( 

    df = df.dropna(subset = df.columns.values, how='any', inplace=True)

这似乎解决了大部分问题,除了线需要低于60的情况。 我一定是语法错误?或者这里有什么问题? 谢谢!

最佳答案

我想你需要boolean indexing用于过滤,而不是 dropna您可以使用 notnull 添加新的(第三个)条件- 获取 t 列中的所有非 NaN 值。第一列中的 NaN 值按第一个和第二个条件过滤:

df['t'] = pd.to_datetime(df['t'], format = '%d/%m/%Y %H:%M', errors='coerce')
df.iloc[:,1] = pd.to_numeric(df.iloc[:,1], errors='coerce')  
df = df[(df.iloc[:,1] < 60) & (df.iloc[:,1] > 0) & (df['t'].notnull())]

print (df)
                     t  baaa
0  2014-11-13 23:43:00  17.6
1  2014-11-13 23:44:00  17.7
3  2014-11-13 23:46:00  17.7
4  2014-11-14 00:34:00  16.0
5  2014-11-14 00:35:00  15.9
7  2014-11-14 01:25:00  14.9
8  2014-11-14 01:26:00  14.9
10 2014-11-14 02:16:00  14.3
11 2014-11-14 02:17:00  14.3
13 2014-11-14 03:09:00  13.0
15 2014-11-14 02:19:00  14.3
16 2014-11-14 03:59:00  12.6
17 2014-11-14 04:00:00  12.6
18 2014-11-14 05:41:00  11.7
19 2014-11-14 05:42:00  11.7
21 2014-11-14 04:53:00  12.2

关于python - 根据它们的类型和值删除 "faulty"行 pandas 数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40099924/

相关文章:

python - 使用 Playwright 保存登录信息

python - 转换 Pandas 列的数据类型

python - 如何使用 pandas 将整个列字符串转换为数据框中的 float ?

python - Google Drive API 客户端 (Python) : Insufficient Permission for files(). insert()

python - IO错误 : broken data stream when reading image file

python - Django 中是否有任何函数可以测试模型的字段实例是否为主键?

python - 删除行中任意位置包含特定值的行(Pandas、Python 3)

python - 识别具有相似地址的 ID

python - 将随机纬度/经度点合并到 Pandas 普查区旅行调查数据中

python - 带变量的结构解包