【问题标题】:If statement to remove and replace a stringif 语句删除和替换字符串
【发布时间】:2021-12-19 09:29:00
【问题描述】:

我正在尝试删除使其成为强字符串的部分字符串,以便它可以成为整数。虽然,我还需要考虑到字符串的变化。

我试图把它放到一个函数中;这是我所做的:

import numpy as np

def rem(x):
    data = []
    for i in x:
        if "m" in i:
            data.append(i.replace(".00m", '000000'))
        elif "Th" in i:
            data.append(i.replace("Th.", '000'))
    return data
    
data_array = np.array(['£67.50m', '£63.00m', '£49.50m','£90Th.', '£720Th.'], dtype=object)

rem(data_array)
>['£67.50m', '£63000000', '£49.50m', '£90000', '£720000']

我如何考虑在m 之前我也会有 0-9 的数字?

我已经在我更大的数据框中尝试过这个,但我收到以下错误:

TypeError: 'float' 类型的参数不可迭代

我假设这是因为该函数没有考虑到.50m, .20m ...

使用@Ptit Xav 建议:

def rem(x):
    data = []
    for i in x:
        if "m" in i:
            xi = re.sub("[^\d]", "", i)
            data.append(int(xi)*10000)
        elif "Th" in i:
            hi = re.sub("[^\d]", "", i)
            data.append(int(hi)*1000)
    return data

【问题讨论】:

  • @Mahrkeenerh 不,因为这只会删除字符串。我要求删除和替换
  • 您应该删除不需要的字符,转换为浮点数,然后乘以 1000 或 1000000,然后再转换回字符串,并在开头添加货币。
  • @PtitXav 这是一个有趣的方法,我会试试的!
  • 您要删除和替换究竟是什么?好像你没有说完你的句子

标签: python


【解决方案1】:

可以使用包re中的替换方法sub

import numpy as np
import re

def rem(x):
    data = []
    for i in x:
        if "m" in i:
            data.append(re.sub("(\.\d+m)", '000000', i))
        elif "Th" in i:
            data.append(i.replace("Th.", '000'))
    return data

【讨论】:

    【解决方案2】:

    我替换了这段代码:

    data.append(i.replace(".00m", '000000'))
    

    与:

    data.append(i.split(".")[0] + "000000")
    

    输出代码为:

    >['£67000000', '£63000000', '£49000000', '£90000', '£720000']
    

    【讨论】:

      【解决方案3】:

      有转换:

      if "m" in i:
          xi = re.sub("[^\d.]", "", i)
          data.append("{}{:.0f}".format(i[0],float(xi)*1000000))
      elif "Th" in i:
          hi = re.sub("[^\d.]", "", i)
          data.append("{}{:.0f}".format(i[0],float(hi)*1000))
      

      【讨论】:

        【解决方案4】:

        我认为您可以将if "m" in i:elif "Th" in i: 替换为正则表达式,使其更加健壮。

        import re
        import warnings
        import numpy as np
        
        RE_ENDS_M = re.compile('\.(\d{2})m$')
        RE_ENDS_TH = re.compile('Th\.$')
        
        def rem(x):
            data = []
            for i in x: 
                if RE_ENDS_M.search(i):
                    data.append(re.sub(RE_ENDS_M, "\g<1>0000", i))
                elif RE_ENDS_TH.search(i):
                    data.append(re.sub(RE_ENDS_TH, '000', i))
                else:
                    warnings.warn("Ignoring data: %s" % i) 
            return data
            
        data_array = np.array(
            ['£67.50m', '£63.00m', '£49.50m','£90Th.', '£720Th.', '1€50'],
            dtype=object
        )
        
        print(rem(data_array))
        
        # Outputs:
        # UserWarning: Ignoring data 1€50
        #  warnings.warn("Ignoring data %s" % i)
        # ['£67500000', '£63000000', '£49500000', '£90000', '£720000']
        
        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-05-11
          • 2020-03-18
          • 1970-01-01
          • 2013-09-22
          • 1970-01-01
          相关资源
          最近更新 更多