【问题标题】:Python dataframe rows contains multiple list of string searchPython数据框行包含多个字符串搜索列表
【发布时间】:2019-03-23 02:02:01
【问题描述】:

我有一个字符串格式的元素列表,我想在每一行中搜索并删除其他元素。

下面的代码可以正常工作。

但是,它会替换从列表的最后一个元素开始的搜索。

我正在尝试从列表“l”中捕获所有结果。

请参阅下面的输入和预期输出。

代码:

l = ['Testing','Goals are met','Mathematics subject','tesTed prototype','Some Test']
df = pd.DataFrame(l)
df.columns = ['l']

输入数据:

    l
0   Testing
1   Goals are met
2   Mathematics subject
3   tesTed prototype
4   Some Test

捕获字符串的代码包含:

select_list = ["Math",'Test']

for s in select_list:
    # keeping into a dataframe
    df1 = df[df.l.str.contains(s,case=False)]

df1

预期输出:注意上面的代码没有从上面选择字符串“Math”。

l
0   Testing
2   Mathematics subject
3   tesTed prototype
4   Some Test

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    原因是您在 for 循环的每次迭代中都重新分配给 df1

    您应该使用正则表达式

    filtered_df = df[df['l'].str.contains('|'.join(select_list), case=False)]
    

    输出:

                         l
    0              Testing
    2  Mathematics subject
    3     tesTed prototype
    4            Some Test
    

    上面的.join 调用产生字符串'Math|Test',当传递给.str.contains 时,告诉它查找至少包含'Math''Test' 之一的所有行。如果您向select_list 添加更多字符串,那么它也会查找它们。

    请注意,在某些情况下(例如,如果 select_list 中的字符串包含“.”等特殊字符),这种方法可能需要修改。

    【讨论】:

      【解决方案2】:

      请试试这个

      select_list = ["Math",'Test']
      df1 =  pd.DataFrame([], columns = ['l'])
      for s in select_list:
          df1 = pd.merge(df1, df[df.l.str.contains(s,case=False)], how='outer')
      

      替代:除了在loop 中使用dataframe,您还可以使用list 来捕获结果并创建dataframe

      l2 = []
      for s in select_list:
          l2.extend(df[df.l.str.contains(s,case=False)].values.tolist())
      
      df3 = pd.DataFrame(l2)
      df3.columns = ['l']
      

      【讨论】:

        猜你喜欢
        • 2018-03-24
        • 1970-01-01
        • 2021-06-12
        • 2011-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多