【问题标题】:Filtering out None from the list of pd.Series / or finding out Nonetype objects in the list of pd.Series从 pd.Series 列表中过滤掉 None / 或在 pd.Series 列表中找出 Nonetype 对象
【发布时间】:2021-10-23 21:50:33
【问题描述】:

我在删除列表中的 Nonetype 对象时遇到问题。 ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

这发生在:

import pandas as pd
#List of pd.Series with some of the objects are None
results = [pd.Series([1,2,3,4]), None, pd.Series([2,3,4,5])]
print(list(filter(None, results)))

如何过滤掉列表中的 Nonetype 对象? 我知道我可以使用循环,但它不会是 Python 的方式。

【问题讨论】:

  • pd.Series([1,2,None,4]) 是否将其视为无?
  • @Epsi95 我不想将其视为无。我的数据不包括此类情况。
  • 发布一个演示问题的工作脚本。当我运行你的例子时,我得到<filter object at 0x7fddcd7fd6a0>
  • @hun pd.Series([None, None,None,None]) 呢,你认为它是无吗?
  • @Epsi95 不。我不想。感谢您询问详细信息。好像我错过了一个相当重要的背景。

标签: python pandas list nonetype


【解决方案1】:

在这种情况下,您可以使用内置 python 方法 isinstance 来检查您的元素是否是 pandas.Series 的实例:

import pandas as pd
#List of pd.Series with some of the objects are None
results = [pd.Series([1,2,3,4]), None, pd.Series([2,3,4,5])]
[i for i in results if isinstance(i, pd.Series)]

list(filter(lambda x: isinstance(x, pd.Series), results))

输出:

[0    1
 1    2
 2    3
 3    4
 dtype: int64,
 0    2
 1    3
 2    4
 3    5
 dtype: int64]

【讨论】:

    【解决方案2】:

    好吧,如果问题是列表中的“无”元素,您可以随时创建另一个没有它们的列表并覆盖第一个列表:

    results=[i for i in results if i is not None ].
    

    这也避免了任何“显式”循环,但显然,在内部,存在一个循环。

    【讨论】:

    【解决方案3】:

    您收到错误是因为,请考虑以下 2 种情况

    1. [无,1,2,3]

    现在,当您比较 None 时,您会得到以下结果

    1. 是的(因为无就是无)
    2. [对,错,错,错]

    现在对于第一种情况,很明显它是 None 但是对于第二种情况,python 是否想将其视为 None just because there is one None 或者您认为 there is not all None 没问题,这就是错误的根源。 any 表示如果至少有一个 None 则您将其视为 None 并且 all 意味着应该有所有 None

    #List of pd.Series with some of the objects are None
    results = [pd.Series([1,2,3,4]), None, pd.Series([2,3,4,5])]
    
    def is_none(x):
      try:
        return return any(x == None)
      except:
        return x is None
    
    print(list(filter(is_none, results)))
    
    # [0    1
    # 1    2
    # 2    3
    # 3    4
    # dtype: int64, None, 0    2
    # 1    3
    # 2    4
    # 3    5
    # dtype: int64]
    

    【讨论】:

    • 我认为 OP 只是想删除 None。所有 pd.Series 对象都应该保留。
    • @tdelaney 哦好吧,要求不是很清楚,谢谢
    【解决方案4】:

    filter函数为None时,python将对每一项(bool(item))进行真值测试。那么,pd.Series 什么时候应该是True?是不是它的所有值都是True?任何价值观?也许就在系列不为空的时候。关键是,一个系列可以通过多种方式实现。这就是错误消息告诉您的内容。

    由于您的目标是过滤掉None,而且列表推导式是比filter 更好的选择,因此您可以只测试None

    print([value for value in results if value is not None])
    

    【讨论】:

      猜你喜欢
      • 2020-11-24
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 1970-01-01
      • 2020-01-05
      • 2023-03-10
      相关资源
      最近更新 更多