【问题标题】:Python: Split a String Field into 3 Separate Fields using LambdaPython:使用 Lambda 将字符串字段拆分为 3 个单独的字段
【发布时间】:2017-11-02 00:58:50
【问题描述】:

我有一个 Python 数据框,其中包含一个名为“SEGMENT”的列。我想将列分成三列。请查看以黄色突出显示的我想要的输出。

以下是我尝试过的代码。不幸的是,我什至无法让第一个替换语句起作用。 : 不会被 - 取代。任何帮助是极大的赞赏!

df_stack_ranking['CURRENT_AUM_SEGMENT'] = df_stack_ranking['CURRENT_AUM_SEGMENT'].replace(':', '-')

s = df_stack_ranking['CURRENT_AUM_SEGMENT'].str.split(' ').apply(Series, 1).stack()

s.index = s.index.droplevel(-1)

s.name = 'SEGMENT'

df_stack_ranking.join(s.apply(lambda x: Series(x.split(':'))))

【问题讨论】:

    标签: python string pandas lambda split


    【解决方案1】:

    设置

    df = pd.DataFrame({'SEGMENT': {0: 'Hight:33-48', 1: 'Hight:33-48', 2: 'Very Hight:80-88'}})
    
    df
    Out[17]: 
                SEGMENT
    0       Hight:33-48
    1       Hight:33-48
    2  Very Hight:80-88
    

    解决方案

    使用 split 将列分成 3 部分,然后展开以创建新的 DF。

    df.SEGMENT.str.split(':|-',expand=True)\
      .rename(columns=dict(zip(range(3),\
      ['SEGMENT','SEGMENT RANGE LOW','SEGMENT RANGE HIGH'])))
    Out[13]: 
          SEGMENT SEGMENT RANGE LOW SEGMENT RANGE HIGH
    0       Hight                33                 48
    1       Hight                33                 48
    2  Very Hight                80                 88
    

    【讨论】:

      【解决方案2】:

      通过:(|) \s*-\s* 使用str.split\s* 表示零个或多个空格):

      df = pd.DataFrame({'SEGMENT': ['Hight: 33 - 48', 'Hight: 33 - 48', 'Very Hight: 80 - 88']})
      
      cols = ['SEGMENT','SEGMENT RANGE LOW','SEGMENT RANGE HIGH']
      df[cols] = df['SEGMENT'].str.split(':\s*|\s*-\s*',expand=True)
      print (df)
            SEGMENT SEGMENT RANGE LOW SEGMENT RANGE HIGH
      0       Hight                33                 48
      1       Hight                33                 48
      2  Very Hight                80                 88
      

      str.extract 的解决方案:

      cols = ['SEGMENT','SEGMENT RANGE LOW','SEGMENT RANGE HIGH']
      df[cols] = df['SEGMENT'].str.extract('([A-Za-z\s*]+):\s*(\d+)\s*-\s*(\d+)', expand = True)
      print (df)
            SEGMENT SEGMENT RANGE LOW SEGMENT RANGE HIGH
      0       Hight                33                 48
      1       Hight                33                 48
      2  Very Hight                80                 88
      

      【讨论】:

      • 很高兴能帮上忙 ;)
      【解决方案3】:

      因为我喜欢使用 str.extract 正则表达式命名列

      regex = '\s*(?P<SEGMENT>\S+)\s*:\s*(?P<SEGMENT_RANGE_LOW>\S+)\s*-\s*(?P<SEGMENT_RANGE_HIGH>\S+)\s*'
      df.SEGMENT.str.extract(regex, expand=True)
      
        SEGMENT SEGMENT_RANGE_LOW SEGMENT_RANGE_HIGH
      0    High                33                 48
      1    High                33                 48
      2    High                80                 88
      

      设置

      df = pd.DataFrame({'SEGMENT': ['High: 33 - 48', 'High: 33 - 48', 'Very High: 80 - 88']})
      

      【讨论】:

        【解决方案4】:
        columns = ['SEGMENT', 'SEGMENT RANGE LOW', 'SEGMENT RANGE HIGH']
        df['temp'] = df['SEGMENT'].str.replace(': ','-').str.split('-')
        for i, c in enumerate(columns):
            df[c] = df['temp'].apply(lambda x: x[i])
        del df['temp']
        

        用连字符替换冒号,然后拆分连字符以获取 3 列的值列表。然后为 3 列中的每一列分配值并删除临时列。

        【讨论】:

          【解决方案5】:

          我会使用正则表达式对 str.extract 执行此操作

          df.SEGMENT.str.extract('([A-Za-z ]+):(\d+)-(\d+)', expand = True).rename(columns = {0: 'SEGMENT', 1: 'SEGMENT RANGE LOW', 2: 'SEGMENT RANGE HIGH'})
          
              SEGMENT     SEGMENT RANGE LOW   SEGMENT RANGE HIGH
          0   High        33                  48
          1   High        33                  48
          2   Very High   80                  88
          

          【讨论】:

            猜你喜欢
            • 2010-10-12
            • 1970-01-01
            • 2016-12-08
            • 2017-04-15
            • 2011-09-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多