用NaN替换超出限制的数字

时间:2017-07-23 22:03:22

标签: python python-3.x pandas dataframe replace

time                 c1        c2
1 2017-07-23 11:39:10  3.385661  3.193302
2 2017-07-23 11:39:20  3.157000  2.912690
3 2017-07-23 11:39:30  3.277145  3.124290
4 2017-07-23 11:39:40  3.126075  2.982679
5 2017-07-23 11:39:50  3.135766  2.985840
6 2017-07-23 11:40:00  3.166134  3.016147
7 2017-07-23 11:40:10  2.487507  2.256214
8 2017-07-23 11:40:20  3.348368  3.158728
9 2017-07-23 11:40:30  3.219001  2.996357
10 2017-07-23 11:40:40  2.862558  2.711170
11 2017-07-23 11:40:50  2.558438  2.346303
12 2017-07-23 11:41:00  3.338989  3.192018
13 2017-07-23 11:41:10  2.674149  2.496557
14 2017-07-23 11:41:20  3.523231  3.315889
15 2017-07-23 11:41:30  2.931527  2.740840
16 2017-07-23 11:41:40  3.078464  2.938004

我有一个如下的数据框。除了时间列之外,如何使用NAN替换大于或小于特定数字的所有值。请建议。

我试图做这样的事情:

cols = df.columns.difference(['time'])
df[df[cols].values < 3.523231)] = np.nan

它没有用。请帮助。

2 个答案:

答案 0 :(得分:0)

比如说,您试图过滤3下的值。您可以使用boolean indexing

In [835]: df[cols] = df[cols][df[cols] >= 3]; df[cols].head()
Out[835]: 
         c1        c2
0  3.157000       NaN
1  3.277145  3.124290
2  3.126075       NaN
3  3.135766       NaN
4  3.166134  3.016147

您还可以使用df.applymap

In [836]: df[cols] = df[cols].applymap(lambda x: np.nan if x < 3 else x); df[cols].head()
Out[836]: 
         c1        c2
0  3.157000       NaN
1  3.277145  3.124290
2  3.126075       NaN
3  3.135766       NaN
4  3.166134  3.016147

答案 1 :(得分:0)

df[cols] = df[cols].mask((df[cols].values < float(to_exclude)), np.nan)
df[cols] = df[cols].mask((df[cols].values > float(to_exclude)), np.nan)