在元组列表中删除包含nan的元组 - Python

时间:2016-05-27 15:12:51

标签: python list tuples nan spyder

我有很长的元组列表,并希望使用Python删除任何包含nan的元组。

我现在有什么:    x = [('录制开始',0),(nan,4),(nan,7),...,('事件标记1',150)]

结果我正在寻找:   x = [('录制开始',0),('事件标记1',150)]

我尝试过使用np.isnan及其变体,但没有成功并且一直收到错误:输入类型不支持ufunc'isnan',输入无法安全地强制转换为任何支持类型根据投射规则“安全”

任何建议将不胜感激!

4 个答案:

答案 0 :(得分:3)

您可以使用列表推导来检查元组中的任何项是否为NaN。首先检查类型,然后使用math.isnan进行检查,因为它不适用于其他类型:

library(dplyr)
dcast(df, Time ~ ...) %>% select(Time, Speed, Acc, Energy)
Time Speed Acc Energy
10    10  -2     10
15     9  -1     NA
20     9   0      2

输出:

import math

x = [('Recording start', 0), (float('nan'), 4), (float('nan'), 7), ('Event marker 1', 150)]
res = [t for t in x if not any(isinstance(n, float) and math.isnan(n) for n in t)]
print(res)

答案 1 :(得分:1)

使用列表理解:

x = [('Recording start', 0), (nan, 4), (nan, 7), ('Event marker 1', 150)]

new = [i for i in x if nan not in i]

答案 2 :(得分:0)

res = [n for n in x if not nan in n]

返回x中没有对象nan的所有对象。

答案 3 :(得分:0)

至少在我对python的使用中,nan恢复了未定义的错误',这就是我自己定义它的原因。 我认为您可以使用Python过滤器功能来满足您的需求。参见示例:

nan = float('nan')
lst = [('Recording start', 0), (nan, 4), (nan, 7), ('Event marker 1', 150)]
y = filter( lambda x: nan not in x, lst)
print y
  

[('录制开始',0),('事件标记1',150)]