我有一个数据集,其中包含一列日期和时间值,另一列包含一些测量值(浮点数)。但是,在某些测量期间,发生错误,导致一些奇怪的条目 - 下面的示例(这些包括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的条件外,这似乎解决了大部分问题。 我的语法必须错误吗?或者这里有什么问题? 谢谢!
答案 0 :(得分:2)
我认为您需要boolean indexing
进行过滤,而dropna
您可以使用notnull
添加新的(第三)条件 - 在{{1}列中获取所有非NaN
值}}。第一列中的t
值按第一和第二条件进行过滤:
NaN