【问题标题】:splitting at underscore in python and storing the first value在python中以下划线拆分并存储第一个值
【发布时间】:2021-04-28 20:10:32
【问题描述】:

我有一个类似 df 的 pandas 数据框,其中有一列construct_name

construct_name
aaaa_t1_2    
cccc_t4_10
bbbb_g3_3

等等。我想先将下划线处的所有名称拆分,并将第一个元素(aaaa、cccc 等)存储为另一个列名。

预期输出

construct_name  name
aaaa_t1_2       aaaa
cccc_t4_10      bbbb

等等。

我尝试了以下 df['construct_name'].map(lambda row:row.split("_")) 它给了我一个类似的列表

[aaaa,t1,2]
[cccc,t4,10]

等等

但是当我这样做时

df['construct_name'].map(lambda row:row.split("_"))[0] 获取列表的第一个元素时出现错误。你能建议一个修复。谢谢

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    只需使用向量化的str 方法split 并在列表上使用整数索引来获取第一个元素:

    In [228]:
    
    df['first'] = df['construct_name'].str.split('_').str[0]
    df
    Out[228]:
      construct_name first
    0      aaaa_t1_2  aaaa
    1     cccc_t4_10  cccc
    2      bbbb_g3_3  bbbb
    

    【讨论】:

      【解决方案2】:

      split 采用可选参数maxsplit

      >>> construct_name = 'aaaa_t1_2'
      >>> name, rest = construct_name.split('_', 1)
      >>> name
      'aaaa'
      

      【讨论】:

      • OP 正在寻找一种不在单个字符串上的 pandas 方法
      【解决方案3】:

      执行split 后,您应该得到第一个元素(使用[0])。而不是在map之后:

      In [608]: temp['name'] = temp['construct_name'].map(lambda v: v.split('_')[0])
      
      In [609]: temp
      Out[609]: 
        construct_name  name
      0      aaaa_t1_2  aaaa
      1     cccc_t4_10  cccc
      2      bbbb_g3_3  bbbb
      

      【讨论】:

        【解决方案4】:

        使用矢量化str.split 方法的另一种方法是传递expand=True 标志,然后为每个拆分部分返回一列。

        >>> s = pd.Series( ['aaaa_t1_2', 'cccc_t4_10', 'bbbb_g3_3'], name='construct_name')
        
        >>> s.str.split('_', expand=True)  # to see what expand=True does
              0   1   2
        0  aaaa  t1   2
        1  cccc  t4  10
        2  bbbb  g3   3
        
        >>>  s.str.split('_', expand=True)[0]  # what you want, select first elements
        0    aaaa
        1    cccc
        2    bbbb
        

        例如,如果您想保留第一个和第二个值,这将特别有用。

        expand=True 标志的一般行为而言,请注意,如果输入字符串的下划线数量不同,您可以得到Nones:

        >>> s = pd.Series( ['aaaa_t1_2', 'cccc_t4', 'bbbb_g33'], name='construct_name')
        
        >>> s.str.split('_', expand=True)
              0    1     2
        0  aaaa   t1     2
        1  cccc   t4  None
        2  bbbb  g33  None
        

        【讨论】:

          【解决方案5】:
          df['name'] = df['construct_name'].str.split('_').str.get(0)
          

          df['name'] = df['construct_name'].str.split('_').apply(lambda x: x[0])
          

          【讨论】:

            猜你喜欢
            • 2015-07-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-03-10
            • 2023-03-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多