在列中搜索多个匹配的整数

时间:2017-07-21 19:06:49

标签: python pandas search dataframe

我正在尝试使用可以包含一个或多个整数值的列搜索数据库,以匹配一个或多个给定的整数。我刚开始使用Python和Pandas。

数据库中的整数之间有一个' - ',例如

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

我无法弄清楚如何解析这些值,同时使得订单无关紧要。所以,假设我有1123和1124作为两个整数找到匹配,这里的最终目标是显示匹配整数的客户。

非常感谢任何输入!

5 个答案:

答案 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.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

然后我们用它来过滤。

答案 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)

您可以使用正则表达式解析字符串。我使用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