【问题标题】:How to split a column with contains a string如何拆分包含字符串的列
【发布时间】:2020-02-20 21:32:36
【问题描述】:

如果_ 出现,我有一个数据框需要拆分列

Name = [('Hello'),
      ('Spider'),
      ('Captain'),
      ('Superman'),
       ('Hello_1'),
       ('Superman_1')]
dfName = pd.DataFrame(Name, columns=['Name'])

我的出局

    Name
0   Hello
1   Spider
2   Captain
3   Superman
4   Hello_1
5   Superman_1

预期结果

df1

    Name      
0   Hello
1   Spider
2   Captain
3   Superman

df2

    Name_
0   Hello_1
1   Superman_1

【问题讨论】:

标签: python pandas


【解决方案1】:
dfnamewithout_regex = dfName[~dfName['Name'].str.contains('_')]
dfnamewithout_regex
    Name
0   Hello
1   Spider
2   Captain
3   Superman

dfnamewith_regex = dfName[dfName['Name'].str.contains('_')]
dfnamewith_regex
Name
4   Hello_1
5   Superman_1

如果要删除索引,请添加 .reset_index(drop=True)

【讨论】:

    【解决方案2】:

    您可以使用此代码拆分数据框:

    df1 = dfName[~dfName["Name"].str.contains('_1', na=False)].reset_index(drop=True)
    df2 = dfName[dfName["Name"].str.contains('_1', na=False)].reset_index(drop=True)
    

    df1的输出:

    Name
    0   Hello
    1   Spider
    2   Captain
    3   Superman
    

    df2的输出:

        Name
    0   Hello_1
    1   Superman_1
    

    【讨论】:

      【解决方案3】:

      您可能需要先将您的第一个列表拆分为两个子列表:

      >>> name = 'Hello Spider Captain Superman Hello_1 Superman_1'.split()
      >>> name
      ['Hello', 'Spider', 'Captain', 'Superman', 'Hello_1', 'Superman_1']
      >>> col1 = [n for n in name if '_' not in n]
      >>> col2 = [n for n in name if '_' in n]
      >>> col1
      ['Hello', 'Spider', 'Captain', 'Superman']
      >>> col2
      ['Hello_1', 'Superman_1']
      >>> 
      

      注意:按照约定,变量应该小写,以区别于类。 https://www.python.org/dev/peps/pep-0008/#function-and-variable-names

      【讨论】:

        【解决方案4】:

        使用Series.str.contains 进行掩码并通过反转掩码过滤不包含~ 用于df1 和不用于df2 通过boolean indexing,最后添加DataFrame.reset_index 默认RangeIndex

        m = dfName['Name'].str.contains('_')
        
        #is sample data .reset_index(drop=True) not necessary, added for general solution
        df1 = dfName[~m].reset_index(drop=True)
        print(df1)
               Name
        0     Hello
        1    Spider
        2   Captain
        3  Superman
        
        df2 = dfName[m].reset_index(drop=True)
        print(df2)
                 Name
        0     Hello_1
        1  Superman_1   
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-24
          • 2018-10-10
          相关资源
          最近更新 更多