【问题标题】:How to removed NaN values from a list build with row values in Pandas DataFrame如何使用 Pandas DataFrame 中的行值从列表构建中删除 NaN 值
【发布时间】:2020-02-28 01:49:52
【问题描述】:

伙计们,

我在 pandas 中有一个列,它是一个包含行中所有值的列表。 作为下面的示例。

print(df4['List']) 

0 [8,9,10,25,14,25,14,17,19,30]
1 [nan,85,48,75,nan,96,32,14,15,21,28,17,nan]
2 [nan,85,48,75,nan,]
3 [1,nan]
4 [85,75,41,nan]
5 [nan,65,34]

如何从列表中删除这些“nan”值?

我在 python 中尝试了一些传统的列表方法,但我没有得到 使其在 pandas DataFrame 中具有相同的结果。

作为这个:

while True:
    try:
        df4['PNs NaNs Removed'] = df4['List'].delete([nan])
    except ValueError:
        break

【问题讨论】:

  • 为什么要将列表存储在 pandas DataFrame 中?你想做什么?
  • 我创建了一个包含 1 个列表的列,其中包含来自行的值。所以我想从该列中删除这些“nan”值并保留有效值。
  • 我理解您的问题,我很好奇您为什么首先将列表存储在 DataFrame 中。列表中的值是实际的 NaN 值,对,而不是像“nan”这样的字符串?

标签: python python-3.x pandas


【解决方案1】:

我试图通过使用 Series.dropna 函数来避免迭代:

def no_nan(listy):
    return list(pd.Series(listy).dropna())

df4['List'] = df4['List'].apply(no_nan)

【讨论】:

  • 代码运行没有错误,但是nan 值仍然在列表中。
  • 这很奇怪,它对我有用。如果您创建一个新列,即 df4['List2'] = df4['List'].apply(no_nan) 会发生什么?
  • KeyError: 'List2'
  • 其实我自己也发现了一个:转换为 Series 可能会弄乱类型。我测试的示例是整数列表和Nans,它将整数转换为浮点数。所以这是要注意/小心的事情。
  • @mermaldad 我不知道为什么我在发表评论时不只是运行一些基准测试,哈哈。我也分享你的直觉,它应该更快,我明天将对其进行基准测试并报告!
【解决方案2】:

事实证明,有许多不同的方法可以指示和处理NaN 值,而且会变得非常混乱。此解决方案使用pandas.isna() 测试值,它应该适用于比numpy.isnan() 更广泛的值。

import pandas as pd


df4['List'] = df4['List'].apply(lambda col_val: [item for item in col_val if not pd.isna(item)])

【讨论】:

    猜你喜欢
    • 2017-11-05
    • 2018-09-23
    • 2019-12-22
    • 2013-08-12
    相关资源
    最近更新 更多