【问题标题】:Match string with pandas series that contain a list of strings将字符串与包含字符串列表的 pandas 系列匹配
【发布时间】:2018-03-06 21:50:53
【问题描述】:

我有一个这样的熊猫数据框:

值是字符串类型。我想知道这些行中的每一行是否包含字符串'63'

所以我首先通过 df['col_name'].str.split(',') 拆分 ',' 处的每个字符串,这给了我这个:

所以现在每一行都包含一个字符串列表。我接下来尝试通过执行df['col_name'].str.split(',').str.contains('63') 来匹配字符串,但它给了我这个:

为什么? :( 我希望它对所有行都说 False,尤其是对于包含值 263 的行。

【问题讨论】:

    标签: python pandas split string-matching series


    【解决方案1】:

    df = pd.DataFrame({'col_name': ['196', '107,63,229', '208,263']})

    df['col_name'].str.split(',').apply(lambda numbers: '63' in numbers)

    =>

    0 False 1 True 2 False Name: col_name, dtype: bool

    在你开始的基础上,你如何使用apply并检查字符串63是否在你调用split产生的列表中?祝你好运!

    这里是pandas docs 申请。

    【讨论】:

    • 作为一般规则,我不建议使用单词“list”或任何其他内置函数作为变量名。 True if ... else False 构造也是不必要的
    【解决方案2】:

    您可以使用列表推导。

    这是一个最小的例子。

    import pandas as pd
    
    df = pd.DataFrame({'A': [[196], [504], [63, 100], [35, 1], [63]]})
    
    df2 = df[[63 in x for x in df['A']]]
    
    #            A
    # 2  [63, 100]
    # 4       [63]
    

    这是可行的,因为列表推导会生成一个布尔列表。这当然可以分配给df中的一个系列:

    df['Test'] = [63 in x for x in df['A']]
    
    #            A   Test
    # 0      [196]  False
    # 1      [504]  False
    # 2  [63, 100]   True
    # 3    [35, 1]  False
    # 4       [63]   True
    

    【讨论】:

      【解决方案3】:

      我想说最简单的方法是拆分列,然后应用匿名函数来检查您的值是否存在。

      df['col_name'].str.split(',').apply(lambda x: "63" in x)
      

      回答您的方法为什么不起作用的问题 - 您的拆分操作的结果是一个包含列表值的系列。 str 访问器显然是用于对字符串的操作,因此未定义在拆分结果上使用 str (理想情况下会引发 TypeError)

      【讨论】:

        猜你喜欢
        • 2020-09-09
        • 2015-02-02
        • 1970-01-01
        • 2013-06-18
        • 1970-01-01
        • 2017-07-29
        • 2021-11-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多