如何从列表Python / NumPy中删除Nan

时间:2014-01-09 04:47:00

标签: python numpy

我有一个包含值的列表,其中一个值是'nan'

countries= [nan, 'USA', 'UK', 'France']

我试图将其删除,但我每次都会收到错误

cleanedList = [x for x in countries if (math.isnan(x) == True)]
TypeError: a float is required

当我尝试这个时:

cleanedList = cities[np.logical_not(np.isnan(countries))]
cleanedList = cities[~np.isnan(countries)]

TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

13 个答案:

答案 0 :(得分:71)

问题已经改变,所以要有答案:

无法使用math.isnan测试字符串,因为这需要一个float参数。在countries列表中,您有浮点数和字符串。

在您的情况下,以下内容应该足够了:

cleanedList = [x for x in countries if str(x) != 'nan']

旧答案

countries列表中,文字'nan'是一个不是Python float nan的字符串,相当于:

float('NaN')

在您的情况下,以下内容应该足够了:

cleanedList = [x for x in countries if x != 'nan']

答案 1 :(得分:8)

问题来自np.isnan()无法正确处理字符串值的事实。例如,如果你这样做:

np.isnan("A")
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

但是,pandas版本pd.isnull()适用于数值和字符串值:

pd.isnull("A")
> False

pd.isnull(3)
> False

pd.isnull(np.nan)
> True

pd.isnull(None)
> True

答案 2 :(得分:8)

将numpy导入为np

l = [x for x in list if ~np.isnan(x)]

这应该删除所有NaN。当然,我认为它不是一个字符串,而是实际的NaN。

答案 3 :(得分:6)

使用numpy fancy indexing

In [29]: countries=np.asarray(countries)

In [30]: countries[countries!='nan']
Out[30]: 
array(['USA', 'UK', 'France'], 
      dtype='|S6')

答案 4 :(得分:2)

使用你的例子......

countries= [nan, 'USA', 'UK', 'France']

由于nan不等于nan(nan!= nan)和国家[0] = nan,你应该注意以下几点:

countries[0] == countries[0]
False

然而,

countries[1] == countries[1]
True
countries[2] == countries[2]
True
countries[3] == countries[3]
True

因此,以下内容应该有效:

cleanedList = [x for x in countries if x == x]

答案 5 :(得分:2)

如果您检查元素类型

type(countries[1])

结果将为<class float> 因此您可以使用以下代码:

[i for i in countries if type(i) is not float]

答案 6 :(得分:2)

我喜欢从这样的列表中删除缺失的值:

list_no_nan = [x for x in list_with_nan if pd.notnull(x)]

答案 7 :(得分:2)

另一种实现方法包括使用 filter 像这样:

countries = list(filter(lambda x: str(x) != 'nan', countries))

答案 8 :(得分:2)

一种直接去除nan值的方法是:

import numpy as np    
countries.remove(np.nan)

答案 9 :(得分:1)

在您的示例中,'nan'是一个字符串,因此只需检查字符串

而不是使用isnan() 像这样:

cleanedList = [x for x in countries if x != 'nan']

答案 10 :(得分:0)

从范围列表中排除 0

['ret'+str(x) for x in list(range(-120,241,5)) if (x!=0) ]

答案 11 :(得分:0)

在我看来,大多数建议的解决方案都没有考虑到性能。如果您的列表有很多值,则循环和列表理解不是有效的解决方案。 下面的解决方案在计算时间方面更有效,并且它不假设您的列表包含数字或字符串。

import numpy as np
import pandas as pd
list_var = [np.nan, 4, np.nan, 20,3, 'test']
df = pd.DataFrame({'list_values':list_var})
list_var2 = list(df['list_values'].dropna())
print("\n* list_var2 = {}".format(list_var2))

答案 12 :(得分:-1)

我注意到,例如熊猫会回归&#39; nan&#39;对于空白值。由于它不是字符串,因此您需要将其转换为一个字符串才能匹配它。例如:

ulist = df.column1.unique() #create a list from a column with Pandas which 
for loc in ulist:
    loc = str(loc)   #here 'nan' is converted to a string to compare with if
    if loc != 'nan':
        print(loc)