【问题标题】:pandas filter series with lists of strings as values以字符串列表为值的熊猫过滤器系列
【发布时间】:2021-03-23 07:17:34
【问题描述】:

所以我正在尝试制作一个简单的过滤器,它将接收数据框并过滤掉所有没有目标类型的行。用代码解释会更容易:

    import pandas as pd

test = [{
        "genre":["RPG","Shooter"]},
        {"genre":["RPG"]},
        {"genre":["Shooter"]}]
        
data =pd.DataFrame(test)

fil = data.genre.isin(['RPG'])

我希望过滤器返回包含以下元素的数据框:

[{"genre":["RPG"]},
{"genre":["RPG", "Shooter"]}]

这是我在尝试我的代码时遇到的错误:

SystemError: <built-in method view of numpy.ndarray object at 0x00000180D1DF2760> returned a result with an error set

【问题讨论】:

  • @Vaishali 确实问题是重复的,但我相信这里的答案比另一个提供的更好。

标签: python pandas


【解决方案1】:

问题是genre的元素是列表,所以isin不起作用。使用:

mask = data['genre'].apply(frozenset(['RPG']).issubset)
print(data[mask])

输出

            genre
0  [RPG, Shooter]
1           [RPG]

表达式:

frozenset(['RPG']).issubset

检查每一行中是否包含任何列表,来自documentation

测试集合中的每个元素是否在其他元素中。

因此您还可以轻松检查多个值,例如:

mask = data['genre'].apply(frozenset(['RPG', "Shooter"]).issubset)
print(data[mask])

输出

            genre
0  [RPG, Shooter]

【讨论】:

    【解决方案2】:

    你想要:

    data[data.genre.apply(lambda x: 'RPG' in x)]
    

    或者:

    data[data.genre.explode().eq('RPG').any(level=0)]
    

    输出:

                genre
    0  [RPG, Shooter]
    1           [RPG]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-22
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 2021-04-17
      • 2019-04-04
      • 2020-03-07
      • 2019-03-04
      相关资源
      最近更新 更多