【问题标题】:Map pandas series with string pattern用字符串模式映射熊猫系列
【发布时间】:2021-12-08 20:05:33
【问题描述】:

您好,我想使用字符串模式映射熊猫系列

s=pd.DataFrame([['AMcU8', 10], ['AM8v', 15], ['ASw9', 14],['ASw7', 14]], columns = ['Code', 'Quantity'])

s["newcode"]=s["Code"].map({"AM.*8.*" : "AM8", "AS.*9.*" : "AS9"})

但我明白了:

   Code  Quantity newcode
0  AMcU8       10     NaN
1  AM8v        15     NaN
2  ASw9        14     NaN
3  ASw7        14     NaN

代替:

   Code  Quantity newcode
0  AMcU8       10     AM8
1  AM8v        15     AM8
2  ASw9        14     AS9
3  ASw7        14     NaN

有什么想法吗?找不到匹配项时得到一个 NaN 很好

【问题讨论】:

  • 您只是想从原始代码中删除小写字母吗?
  • 不,也可以是大写

标签: python dataframe mapping


【解决方案1】:

您可以使用 Series.replace 并将参数 regex 设置为映射字典 (documentation):

s["newcode"] = s["Code"].replace(regex={"AM.*8.*":"AM8", "AS.*9.*": "AS9"})

产生:

    Code    Quantity    newcode
0   AMcU8   10          AM8
1   AM8v    15          AM8
2   ASw9    14          AS9
3   ASw7    14          ASw7

请注意,不匹配的模式保持不变。

【讨论】:

    【解决方案2】:

    据我所知,没有直接的函数可以执行此操作。

    您可以使用apply()re 执行此操作,并按如下方式遍历您的映射字典:

    mapping = {"AM.*8" : "AM8", "AS.*9" : "AS9"}
    import re
    
    def regex_mapping(x):
        for k, v in mapping.items():
            if re.match(k, x):
                return re.sub(k, v, x)
        return x
    
    s['Code'].apply(regex_mapping)
    

    输出:

    0     AM8
    1     AM8
    2     AS9
    3    ASw7
    Name: Code, dtype: object
    

    【讨论】:

      【解决方案3】:

      据我所知,您无法向Series.map() 提供正则表达式密钥。

      但是,这可以满足您的需要:

      import re
      import pandas as pd
      
      s = pd.DataFrame([['AMcU8', 10], ['AM8', 15], ['ASw9', 14], ['ASw7', 14]], columns=['Code', 'Quantity'])
      
      
      def regex_replace(x, map: dict = None):
          for regex, replacement in map.items():
              if re.match(regex, x):
                  return replacement
          else:
              return x
      
      
      s["newcode"] = s["Code"].apply(regex_replace, map={"AM.*8": "AM8", "AS.*9": "AS9"})
      

      或者,如果您经常将其应用于大型 DataFrame,并希望在这种情况下更快、更高效:

      import re
      import pandas as pd
      from functools import partial
      
      s = pd.DataFrame([['AMcU8', 10], ['AM8', 15], ['ASw9', 14], ['ASw7', 14]], columns=['Code', 'Quantity'])
      
      
      def regex_replace(map: dict = None, x=None):
          for regex, replacement in map.items():
              if regex.match(x):
                  return replacement
          else:
              return x
      
      mapping = partial(regex_replace, {re.compile("AM.*8"): "AM8", re.compile("AS.*9"): "AS9"})
      s["newcode"] = s["Code"].apply(mapping)
      
      

      【讨论】:

        猜你喜欢
        • 2019-09-28
        • 2020-09-25
        • 2020-12-31
        • 2017-11-28
        • 2018-08-08
        • 1970-01-01
        • 2016-09-12
        • 1970-01-01
        相关资源
        最近更新 更多