删除异常值,同时保留数据框中的时间戳
Remove outliers while preserving the timestamps in dataframe
我在数据框中有如下格式的数据:
metric timestamp cas_pre fl_rat ...
0 2017-04-06 11:25:00 687.982849 1627.040283 ...
1 2017-04-06 11:30:00 693.427673 1506.217285 ...
2 2017-04-06 11:35:00 692.686310 1537.114807 ...
....
45 2017-04-06 11:35:00 51987.427673 1537.114807 ...
....
101003 2017-04-06 11:35:00 692.686310 1537.114807 ...
很明显第 45 行需要删除,因为它是一个异常。有多个列和相当多的行(100,000+)。现在我想从中删除异常值,并且一直使用代码:
drop_df = df.drop(columns=['timestamp'])
drop_df = drop_df[(np.abs(stats.zscore(drop_df)) < 3).all(axis=1)]
但是,这会给我没有时间戳的数据。这是因为我无法在 z-score 计算中使用时间戳。但是,我想保留时间戳,在使用 z 分数进行过滤时完全失去了相关性。如下所示:
metric timestamp cas_pre fl_rat ...
0 2017-04-06 11:25:00 687.982849 1627.040283 ...
1 2017-04-06 11:30:00 693.427673 1506.217285 ...
2 2017-04-06 11:35:00 692.686310 1537.114807 ...
....
101003 2017-04-06 11:35:00 692.686310 1537.114807 ...
我怎样才能做到这一点?
明确设置要用于 z-score 计算的列可能更好:
cols = ['cas_pre', 'fl_rat', ...]
df = df[(np.abs(stats.zscore(df[cols])) < 3).all(axis=1)]
或者,您可以仅在 z-score 计算的输入中删除时间戳列:
drop_df = df.drop(columns=['timestamp'])
df = df[(np.abs(stats.zscore(drop_df)) < 3).all(axis=1)]
我在数据框中有如下格式的数据:
metric timestamp cas_pre fl_rat ...
0 2017-04-06 11:25:00 687.982849 1627.040283 ...
1 2017-04-06 11:30:00 693.427673 1506.217285 ...
2 2017-04-06 11:35:00 692.686310 1537.114807 ...
....
45 2017-04-06 11:35:00 51987.427673 1537.114807 ...
....
101003 2017-04-06 11:35:00 692.686310 1537.114807 ...
很明显第 45 行需要删除,因为它是一个异常。有多个列和相当多的行(100,000+)。现在我想从中删除异常值,并且一直使用代码:
drop_df = df.drop(columns=['timestamp'])
drop_df = drop_df[(np.abs(stats.zscore(drop_df)) < 3).all(axis=1)]
但是,这会给我没有时间戳的数据。这是因为我无法在 z-score 计算中使用时间戳。但是,我想保留时间戳,在使用 z 分数进行过滤时完全失去了相关性。如下所示:
metric timestamp cas_pre fl_rat ...
0 2017-04-06 11:25:00 687.982849 1627.040283 ...
1 2017-04-06 11:30:00 693.427673 1506.217285 ...
2 2017-04-06 11:35:00 692.686310 1537.114807 ...
....
101003 2017-04-06 11:35:00 692.686310 1537.114807 ...
我怎样才能做到这一点?
明确设置要用于 z-score 计算的列可能更好:
cols = ['cas_pre', 'fl_rat', ...]
df = df[(np.abs(stats.zscore(df[cols])) < 3).all(axis=1)]
或者,您可以仅在 z-score 计算的输入中删除时间戳列:
drop_df = df.drop(columns=['timestamp'])
df = df[(np.abs(stats.zscore(drop_df)) < 3).all(axis=1)]