我有一个大型数据框,其中包含多个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”完全匹配但在“ |”两侧的预期结果或存在单个值且没有管道的行中。此结果还需要遍历要匹配的字符串列表。
任何指导表示赞赏。谢谢!
答案 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