包含以“ |”分隔的多个值的列中的pandas字符串匹配

时间:2018-12-31 10:52:27

标签: python python-3.x pandas

我有一个大型数据框,其中包含多个ID和值,如下所示:

示例数据帧:

     ID        VALUE
0  5401  2003 | 5411
1  5582         2003
2  9991        62003
3  7440  1428 | 2003

**我想只获取包含来自字符串列表的元素的数据框的子集。

l = [2003, 2005, 5411, 1786]

在上面的示例中,所有与“ 2003”匹配的内容。**

预期结果:

     ID        VALUE
0  5401  2003 | 5411
1  5582         2003
3  7440  1428 | 2003

当前结果:

使用df[df['VALUE'].str.contains('2003')]可以得到包括'62003'在内的所有内容。

使用df[df['VALUE'].str.match('2003')]仅给出:

     ID        VALUE
0  5401  2003 | 5411
1  5582         2003

在这里,3 7440 1428 | 2003丢失了。

是否可以获取与“ 2003”完全匹配但在“ |”两侧的预期结果或存在单个值且没有管道的行中。此结果还需要遍历要匹配的字符串列表。

任何指导表示赞赏。谢谢!

2 个答案:

答案 0 :(得分:3)

您可以使用正则表达式匹配项:

import pandas as pd

data = [[5401,  '2003 | 5411'],
[5582,  '2003'],
[9991,  '62003'],
[7440,  '1428 | 2003']]

df = pd.DataFrame(data=data, columns=['id', 'value'])
result = df[df['value'].str.contains(r'\b2003\b', regex=True)]
print(result)

输出

     id        value
0  5401  2003 | 5411
1  5582         2003
3  7440  1428 | 2003

模式'\b2003\b'与被单词边界包围的2003匹配。如果您有多种模式,则还可以使用正则表达式匹配,例如:

import pandas as pd

data = [[5401,  '2003 | 5411'],
[5582,  '2003'],
[9991,  '62003'],
[7440,  '1428 | 2003'],
[7440,  '2004 | 2002']]

needles = ['2003', '2004']
pattern = '|'.join([r'\b{}\b'.format(needle) for needle in needles])

df = pd.DataFrame(data=data, columns=['id', 'value'])
result = df[df['value'].str.contains(pattern, regex=True)]
print(result)

输出

     id        value
0  5401  2003 | 5411
1  5582         2003
3  7440  1428 | 2003
4  7440  2004 | 2002

另一种方法是在|上分割字符串并检查每个值,例如:

needles = ['2003', '2004']

def contains(xs, ns=set(needles)):
    return any(x.strip() in ns for x in xs.split('|'))


df = pd.DataFrame(data=data, columns=['id', 'value'])
result = df[df['value'].apply(contains)]
print(result)

输出

     id        value
0  5401  2003 | 5411
1  5582         2003
3  7440  1428 | 2003
4  7440  2004 | 2002

答案 1 :(得分:1)

另一个带有str.contains的示例本身,您可以使用正则表达式模式OR (|)

本身传递多个值

从@Daniel借用的初始DataFrame,我在这里寻找三个不同的值,即2003 , 2004 and 2018

DataFrame:

>>> df
     id        value
0  5401  2003 | 5411
1  5582         2003
2  9991        62003
3  7440  1428 | 2003
4  7440  1428 | 2018
5  7440  2004 | 2002

结果:

>>> df[df['value'].str.contains(r'\b2003|2004|2018\b', case=False, regex=True)]
     id        value
0  5401  2003 | 5411
1  5582         2003
3  7440  1428 | 2003
4  7440  1428 | 2018
5  7440  2004 | 2002