2017-07-21 18 views
0

我试图通过数据库搜索可以有一个或多个整数值的列来匹配一个或多个给定的整数。我刚开始使用Python和Pandas。在之间例如在列中搜索多个匹配整数

-------------------------------------------------- 
| Customer 1  | 1143    | 
-------------------------------------------------- 
| Customer 2  |1124-1123| 
-------------------------------------------------- 
| Customer 3  |1254-1234-1642  | 
-------------------------------------------------- 

我不能完全弄清楚如何解析值,并在同一时间让这个顺序没有按” -

在数据库中的整数有一个'不要紧。假设我有1123和1124作为匹配的两个整数,这里的最终目标是用匹配的整数显示客户。

任何输入将不胜感激!

+0

完全匹配还是部分匹配? –

+0

我假设完全匹配意味着我有1123和1124,那么我有一个客户(1123-1124-1125)和另一个客户(1123-1124)。只有第二个客户很重要。 在这种情况下是完全匹配 –

+0

在这种情况下[我的回答](https://stackoverflow.com/a/45245126/4909087)会这样做。 –

回答

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 
+1

这个工程。谢谢! –

+0

@davidli在这种情况下做正确的事情是提出一个新问题,而不是取消标记已经标记的答案。这个答案解决了你最初的担忧,那就是找到一个完全匹配的方法。 –

+0

是的,你是对的。我标记了你的原始答案。 –

-1

你可以使用正则表达式解析字符串。我用c#做了一个例子,你应该没有任何问题移植到python。

 Regex regex = new Regex("[1-9]+"); 

     string example = "1221-1231-4311-1236"; 

     Match match = regex.Match(example); 

     while (match.Success) 
     { 
      Console.WriteLine(match); 
      match = match.NextMatch(); 
     } 

输出张贴在下方,您可以使用任何操作。

enter image description here

+0

对不起,c#示例不会在这里飞。 –

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' 
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)] 
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.applyset字符串列表转换这些列表来台

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 

其中我们然后用过滤的元件。