掉线"错误"基于类型和值的pandas数据帧行

时间:2016-10-18 05:04:23

标签: python pandas

我有一个数据集,其中包含一列日期和时间值,另一列包含一些测量值(浮点数)。但是,在某些测量期间,发生错误,导致一些奇怪的条目 - 下面的示例(这些包括datetime对象的重复部分,其被解释为字符串,不完整的datetime对象,完全随机的字符串,缺失值或值超出范围的另一列(测量值大多在10到50之间,但有时我得到零或像100这样的值)。

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

                                      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'列应该是一个日期时间对象和' baaa'列应该是浮点数> 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的条件外,这似乎解决了大部分问题。 我的语法必须错误吗?或者这里有什么问题? 谢谢!

1 个答案:

答案 0 :(得分:2)

我认为您需要boolean indexing进行过滤,而dropna您可以使用notnull添加新的(第三)条件 - 在{{1}列中获取所有非NaN值}}。第一列中的t值按第一和第二条件进行过滤:

NaN