从Pandas中删除inf / nan值

时间:2017-10-09 14:54:23

标签: pandas numpy

我知道有几个关于此的帖子,但没有一个解决方案似乎有效,我无法弄清楚我做错了什么。

我的数据框中包含inf值的数据。

print [x for x in train_x['meh'] if not np.isfinite(x)]

返回

[inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf, inf]

我试过

train_x.replace([numpy.inf, -numpy.inf], numpy.nan)

但这不会将inf转换为nan

接下来我试了

train_x[np.isinf(train_x)] = np.NaN

...确实将inf转换为nan,但即使nan

,我也无法删除train_x.dropna()

基本上,我需要删除infnan行。

2 个答案:

答案 0 :(得分:0)

好像你可以使用布尔索引

train_x[np.isfinite(train_x) & train_x.notnull()]

您实际上甚至不需要train_x.notnull()

答案 1 :(得分:0)

我使用

创建了一个DataFrame

df = pd.DataFrame({'val1': [1.1, 3.3, 2.2, np.inf], 'val2': [2.2, 6.6, np.inf, 4.4]})

导致

       val1      val2
0  1.100000  2.200000
1  3.300000  6.600000
2  2.200000       inf
3       inf  4.400000

如果您在多个列中有inf,则可以使用

将其更改为NaN

df.applymap(lambda x: np.nan if np.isinf(x) else x)

结果是

   val1  val2
0   1.1   2.2
1   3.3   6.6
2   2.2   NaN
3   NaN   4.4

如果只在一列上有此问题(在此示例中,在列val1上),则可以执行

df.val1.apply(lambda x: np.nan if np.isinf(x) else x)