我有一个字符串格式的元素列表,我想在每一行中搜索并删除其他元素。
下面的代码可以正常工作。
但是,它将替换列表最后一个元素中的搜索。
我正在尝试从列表“ 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
答案 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']