我有一个包含值的列表,其中一个值是'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''
答案 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)