我正在尝试使用可以包含一个或多个整数值的列搜索数据库,以匹配一个或多个给定的整数。我刚开始使用Python和Pandas。
数据库中的整数之间有一个' - ',例如
--------------------------------------------------
| Customer 1 | 1143 |
--------------------------------------------------
| Customer 2 |1124-1123|
--------------------------------------------------
| Customer 3 |1254-1234-1642 |
--------------------------------------------------
我无法弄清楚如何解析这些值,同时使得订单无关紧要。所以,假设我有1123和1124作为两个整数找到匹配,这里的最终目标是显示匹配整数的客户。
非常感谢任何输入!
答案 0 :(得分:1)
考虑以下方法:
In [174]: x
Out[174]:
name id
0 Customer 1 1143
1 Customer 2 1124-1123
2 Customer 3 1254-1234-1642
In [175]: pat = '|'.join(['1123', '1642'])
In [176]: x[x['id'].str.contains(pat)]
Out[176]:
name id
1 Customer 2 1124-1123
2 Customer 3 1254-1234-1642
In [177]: pat
Out[177]: '1123|1642'
答案 1 :(得分:1)
您可以转换为集合并使用设置逻辑然后过滤
s = set(['1123', '1642'])
df[df.id.str.split('-').apply(set) & s]
name id
1 Customer 2 1124-1123
2 Customer 3 1254-1234-1642
pd.Series.str.split
创建一个在'-'
df.id.str.split('-')
0 [1143]
1 [1124, 1123]
2 [1254, 1234, 1642]
Name: id, dtype: object
将pd.Series.apply
与set
一起使用可将这些列表转换为集合
0 {1143}
1 {1123, 1124}
2 {1642, 1254, 1234}
Name: id, dtype: object
然后在集合上下文中使用&
执行逐元素交叉
df.id.str.split('-').apply(set) & s
0 False
1 True
2 True
Name: id, dtype: bool
然后我们用它来过滤。
答案 2 :(得分:0)
根据您的clarification,我认为必须进行完整的正则表达式匹配。您可以将df.str.contains
与正则表达式一起使用:
In [705]: numbers = ['1124', '1123']
In [709]: df
Out[709]:
Customer Number
0 Customer 1 1143
1 Customer 2 1124-1123
2 Customer 3 1254-1234-1642
3 Customer 4 1124-1123-1125
In [710]: df[df.Number.str.contains('^' + '-'.join(numbers) + '$', regex=True)]
Out[710]:
Customer Number
1 Customer 2 1124-1123
答案 3 :(得分:0)
尝试使用pd.series.contains()
df1 = df[df['column_name'].str.contains('1123')]
如果你想找到1123和1124使用加入
list1 =['1123','1124']
listRegex = '|'.join(list1)
df1 = df[df['column_name'].str.contains(listRegex)]
答案 4 :(得分:-1)