Python数据框行包含多个字符串搜索列表

时间:2019-03-23 02:02:02

标签: python python-3.x

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

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

但是,它将替换列表最后一个元素中的搜索。

我正在尝试从列表“ 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

2 个答案:

答案 0 :(得分:4)

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

您应该使用正则表达式

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中的字符串包含特殊字符(如“。”)),则可能需要修改此方法。

答案 1 :(得分:0)

请尝试这个

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')

备用:除了使用dataframe中的loop之外,您还可以使用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']