【问题标题】:How to remove Nan's from a list and extend to a list of lists如何从列表中删除 Nan 并扩展到列表列表
【发布时间】:2018-07-30 09:35:25
【问题描述】:

我正在尝试以正确的顺序将列表扩展到单独的列表列表。但有些价值观是南的。当我这样做时,我得到一个错误ValueError: could not convert string to float:。遍历删除 Nan 的列表然后扩展到列表会更有效吗?

数据集和代码示例如下:

数据:

X    Y
5    6
Nan  Nan
10   5
Nan  Nan
8    2

n=0
for column in data :
    if n == 0 :
        n+=1
        continue
    visuals[0].extend([float(column[0])])
    visuals[1].extend([float(column[1])])

在@Mahesh Karia 的代码之后从 cmets 开始。虚拟数据工作正常,但我的数据集返回空列表。下面提供了两者的示例:

data_1 = [['Nan', 5, 'Nan', 10, 'Nan', 8],
        ['Nan', 6, 'Nan', 5, 'Nan', 2]]

data_2 = [[nan, -5891.3764, -5901.0081390000005, -5939.977304, -5921.11797],
        [nan, 3339.025337, 3346.9211149999996, 3356.405148, 3412.836335]]

所以 data_1 有效,但 data_2 返回一个空列表?

【问题讨论】:

  • 您的原始数据到底是什么?向我们展示它的 Python 形式,而不是打印输出。
  • 如果我正确理解了这个问题,您将不得不比较每个列表项以查看它是字符串 Nan 还是整数。如何通过列表理解创建一个新列表 [float(a) for a in x if a != 'Nan'] 一次性从每个给定列表中过滤掉 Nans(并将整数转换为浮点数)?
  • 您是否尝试获取 2 个列表并制作列表列表?如果是这样,有直接的方法可以做到这一点。
  • .append(item) 比 .extend([item]) 更直接。

标签: python list nan extend


【解决方案1】:
def is_number(s):
    try:
        if str(s).lower() != "nan":
            float(s)
            return True
    except ValueError:
        pass
    return False


data_2 = [['nan', -5891.3764, -5901.0081390000005, -5939.977304, -5921.11797],
        ['nan', 3339.025337, 3346.9211149999996, 3356.405148, 3412.836335]]

visuals = [[],[]]

visuals[0].extend([float(_) for _ in data_2[0] if is_number(_)])
visuals[1].extend([float(_) for _ in data_2[1] if is_number(_)])

print visuals

输出:

[[-5891.3764, -5901.0081390000005, -5939.977304, -5921.11797], [3339.025337, 3346.9211149999996, 3356.405148, 3412.836335]]

【讨论】:

  • 这没有任何意义,但是您的函数可以很好地处理虚拟数据,但是当我尝试在我的数据集上运行它时,它返回一个空列表?原始列表中肯定有确认的数据,所以我不明白为什么它不起作用?
  • 你能粘贴你的数据吗?
  • 我提供了一个数据集示例
  • @JPA0888 更新了代码,现在甚至会考虑负浮点数。
  • 感谢@Mahesh Karia,但我希望从返回的列表中删除 nan。
【解决方案2】:

我会用一个删除所有 nan 值的列表推导来做到这一点。

data = ['1', '2', "nan", '4']
[float(datum) for datum in data if datum != "nan"]

这很容易扩展到列表列表。

data = [['1', '2', 'nan', '4'], ['5', '6', 'nan']]
[[float(bar) for bar in foo if bar != "nan"] for foo in data]

当然,假设您只需要捕获一个字符串值。如果有多个,您可能需要考虑执行自定义处理的函数或 try 语句。

【讨论】:

  • 这似乎并没有消除nan's。我已经打印了 `[[float(bar) for bar in foo if bar != 'nan'] for foo in data]` 并且列表没有改变。
  • 案例匹配吗?试试bar.lower() != “nan”
【解决方案3】:

更通用的解决方案是将浮点转换包装在 try/except 块中:

for column in data:
    ...
    try:
        visuals[0].extend([float(column[0])])
    except ValueError:
        pass

【讨论】:

  • 可能有类似于@Mahesh Karia 的解决方案。它只是返回一个空列表?
猜你喜欢
  • 2014-03-13
  • 2018-01-23
  • 2015-05-30
  • 2021-02-19
  • 2018-09-23
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 2017-06-21
相关资源
最近更新 更多