【问题标题】:Search through column for multiple matching integers在列中搜索多个匹配的整数
【发布时间】:2017-07-21 19:06:48
【问题描述】:

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

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

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

我不太清楚如何解析这些值,同时也让顺序无关紧要。所以假设我有 1123 和 1124 作为两个整数来查找匹配,这里的最终目标是显示具有匹配整数的客户。

任何意见将不胜感激!

【问题讨论】:

  • 是完全匹配还是部分匹配?
  • 我假设完全匹配意味着我有 1123 和 1124,然后我有一个客户(1123-1124-1125)和另一个客户(1123-1124)。只有第二个客户很重要。在这种情况下是完全匹配
  • 在那种情况下my answer 会这样做。
  • 实际上你会如何进行部分匹配?您如何区分客户是部分匹配还是完全匹配?
  • Lethe 正则表达式会改变。查看其他答案

标签: python pandas search dataframe


【解决方案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'

【讨论】:

    【解决方案2】:

    您可以转换为集合并使用集合逻辑然后过滤

    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
    

    然后我们用它来过滤。

    【讨论】:

      【解决方案3】:

      根据您的clarification,我相信完整的正则表达式匹配是必要的。您可以将df.str.match 与正则表达式模式一起使用:

      numbers = ['1124', '1123']
      df
      
           Customer          Number
      0  Customer 1            1143
      1  Customer 2       1124-1123
      2  Customer 3  1254-1234-1642
      3  Customer 4  1124-1123-1125
      
      df[df['Number'].str.match(f'{"-".join(numbers)}$')]  
      
      
           Customer     Number
      1  Customer 2  1124-1123
      

      【讨论】:

        【解决方案4】:

        尝试使用 pd.series.contains()

        df1 = df[df['column_name'].str.contains('1123')]
        

        如果您想查找 1123 和 1124,请使用 join

        list1 =['1123','1124']
        listRegex = '|'.join(list1)
        df1 = df[df['column_name'].str.contains(listRegex)]
        

        【讨论】:

          【解决方案5】:

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

          输出发布在下面,你可以用它做任何事情。

          【讨论】:

          • 抱歉,c# 示例不在这里。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-08-17
          • 1970-01-01
          • 2018-06-07
          • 1970-01-01
          • 2021-03-27
          • 1970-01-01
          • 2014-07-04
          相关资源
          最近更新 更多