以pandas或numpy处理负无穷大

时间:2018-08-20 12:35:51

标签: python pandas numpy dataframe

我有一个包含大量负无穷大数字(-np.inf)的文件,并且我尝试了所有可以想到的解决方案,将其删除或替换为0。

这是数据的样子。

        id     kind            value    time

    0   1   tmx2005-01  -3.402823e+38   01
    1   1   tmx2005-02  -3.402823e+38   02
    2   1   tmx2005-03  -3.402823e+38   03
    3   1   tmx2005-04  -3.402823e+38   04
    4   1   tmx2005-05  -3.402823e+38   05 

如您所见,无限数在“值”列下,我尝试过的一些解决方案是:

df2.dropna()

df2.fillna(0, inplace=True)

df2.replace([np.inf, -np.inf], 0).dropna(subset=["value"], how="all")

df2['value'].replace([np.inf, -np.inf], np.nan)

df2['value']=df2['value'].mask(-np.isinf(df2['value']))

df2['value'][-np.isinf(df2['value'])] =0

关于我可能做错了什么或为什么它做不到的任何想法?

2 个答案:

答案 0 :(得分:2)

value列中的值不是np.inf-np.inf。由于您要删除那些非常大的值,因此可以尝试此操作。在这里,您可以使用df.value[0]作为需要替换的值。首先替换为0:

df.replace(df.value[0], 0)

输出看起来像这样:

    id  kind    value   time
0   1   tmx2005-01  0.0 1
1   1   tmx2005-02  0.0 2
2   1   tmx2005-03  0.0 3
3   1   tmx2005-04  0.0 4
4   1   tmx2005-05  0.0 5

如果要将其替换为np.nan值,则:

df.replace(df.value[0], np.nan)

使用value列作为子集删除空值:

df.dropna(subset=["value"], how="all")

答案 1 :(得分:1)

正如其他人指出的那样,“值”列中的值不是负无穷大。

无论如何都将它们视为无穷大是没有意义的,因为它们与Python中的float的下限(大约2e + 308)相差多个数量级。

作为一种解决方案,我将选择一个值,在该值下,您将认为某事物为负无穷大。这是一种实现此目的的Python方法:

limit = -3.402823*10**38
df2['value'] = np.array([0 if value <= limit else value for value in df2['value'])