【问题标题】:Find column whose name contains a specific string查找名称包含特定字符串的列
【发布时间】:2022-01-17 17:51:25
【问题描述】:

我有一个带有列名的数据框,我想找到一个包含某个字符串但不完全匹配的数据框。我在'spike-2''hey spike''spiked-in' 等列名中搜索'spike''spike' 部分始终是连续的)。

我希望将列名作为字符串或变量返回,因此稍后我会像往常一样使用df['name']df[name] 访问该列。我试图找到方法来做到这一点,但无济于事。有什么建议吗?

【问题讨论】:

    标签: python python-3.x string pandas dataframe


    【解决方案1】:

    只需遍历DataFrame.columns,现在这是一个示例,您最终将得到一个匹配的列名列表:

    import pandas as pd
    
    data = {'spike-2': [1,2,3], 'hey spke': [4,5,6], 'spiked-in': [7,8,9], 'no': [10,11,12]}
    df = pd.DataFrame(data)
    
    spike_cols = [col for col in df.columns if 'spike' in col]
    print(list(df.columns))
    print(spike_cols)
    

    输出:

    ['hey spke', 'no', 'spike-2', 'spiked-in']
    ['spike-2', 'spiked-in']
    

    解释:

    1. df.columns 返回列名列表
    2. [col for col in df.columns if 'spike' in col] 使用变量 col 遍历列表 df.columns,如果 col 包含 'spike',则将其添加到结果列表中。此语法为list comprehension

    如果您只想要包含匹配列的结果数据集,您可以这样做:

    df2 = df.filter(regex='spike')
    print(df2)
    

    输出:

       spike-2  spiked-in
    0        1          7
    1        2          8
    2        3          9
    

    【讨论】:

    • 这是DataFrame.filter 的作用仅供参考(如果需要,您可以提供正则表达式)
    • @xndrme 您将如何使用正则表达式来排除与正则表达式匹配而不是包含的特定列?
    • @DhruvGhulati 也可以像在df[df.columns.drop(spike_cols)] 中那样删除不需要的列,在那里你会得到一个DataFrame,而spike_cols 列表中没有你可以使用不需要的正则表达式获得的列。
    • 更简洁的代码:df[[col for col in df.columns if "spike" in col]]
    • @JacoSolari [col for col in df.columns if any(s in col for s in ['spike', 'foo', 'bar'])]df.filter(regex='(spike)|(foo)|(bar)')
    【解决方案2】:

    This answer 使用 DataFrame.filter 方法在没有列表理解的情况下执行此操作:

    import pandas as pd
    
    data = {'spike-2': [1,2,3], 'hey spke': [4,5,6]}
    df = pd.DataFrame(data)
    
    print(df.filter(like='spike').columns)
    

    将只输出“spike-2”。您也可以使用正则表达式,正如上面 cmets 中的某些人所建议的那样:

    print(df.filter(regex='spike|spke').columns)
    

    将输出两列:['spike-2', 'hey spke']

    【讨论】:

    • 我有很多列,我使用了这段代码,它似乎跳过了一些名称!在这个例子中,想象一下运行这段代码而不返回“hey spke”列!
    • 按名称排除某些列怎么样?我们该怎么做呢?
    【解决方案3】:

    你也可以使用df.columns[df.columns.str.contains(pat = 'spike')]

    data = {'spike-2': [1,2,3], 'hey spke': [4,5,6], 'spiked-in': [7,8,9], 'no': [10,11,12]}
    df = pd.DataFrame(data)
    
    colNames = df.columns[df.columns.str.contains(pat = 'spike')] 
    
    print(colNames)
    

    这将输出列名:'spike-2', 'spiked-in'

    更多关于pandas.Series.str.contains

    【讨论】:

      【解决方案4】:

      您也可以使用此代码:

      spike_cols =[x for x in df.columns[df.columns.str.contains('spike')]]
      

      【讨论】:

        【解决方案5】:
        # select columns containing 'spike'
        df.filter(like='spike', axis=1)
        

        您也可以按名称、正则表达式进行选择。参考:pandas.DataFrame.filter

        【讨论】:

        • 迄今为止最简单的解决方案。简单而强大!
        • 这是一个错误的答案。请注意,问题要求返回带有给定字符串或模式的“列名”,例如spike.
        【解决方案6】:
        df.loc[:,df.columns.str.contains("spike")]
        

        【讨论】:

        • 虽然它没有完全回答原始问题,但我真的很喜欢这个解决方案,因为它直接返回切片的 DataFrame(这实际上也可能是 OP 所追求的)。
        【解决方案7】:

        根据 Start、Contains 和 Ends 获取名称和子集:

        # from: https://stackoverflow.com/questions/21285380/find-column-whose-name-contains-a-specific-string
        # from: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.contains.html
        # from: https://cmdlinetips.com/2019/04/how-to-select-columns-using-prefix-suffix-of-column-names-in-pandas/
        # from: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.filter.html
        
        
        
        
        import pandas as pd
        
        
        
        data = {'spike_starts': [1,2,3], 'ends_spike_starts': [4,5,6], 'ends_spike': [7,8,9], 'not': [10,11,12]}
        df = pd.DataFrame(data)
        
        
        
        print("\n")
        print("----------------------------------------")
        colNames_contains = df.columns[df.columns.str.contains(pat = 'spike')].tolist() 
        print("Contains")
        print(colNames_contains)
        
        
        
        print("\n")
        print("----------------------------------------")
        colNames_starts = df.columns[df.columns.str.contains(pat = '^spike')].tolist() 
        print("Starts")
        print(colNames_starts)
        
        
        
        print("\n")
        print("----------------------------------------")
        colNames_ends = df.columns[df.columns.str.contains(pat = 'spike$')].tolist() 
        print("Ends")
        print(colNames_ends)
        
        
        
        print("\n")
        print("----------------------------------------")
        df_subset_start = df.filter(regex='^spike',axis=1)
        print("Starts")
        print(df_subset_start)
        
        
        
        print("\n")
        print("----------------------------------------")
        df_subset_contains = df.filter(regex='spike',axis=1)
        print("Contains")
        print(df_subset_contains)
        
        
        
        print("\n")
        print("----------------------------------------")
        df_subset_ends = df.filter(regex='spike$',axis=1)
        print("Ends")
        print(df_subset_ends)
        

        【讨论】:

          【解决方案8】:

          返回具有所需列的 df 子集的另一种解决方案:

          df[df.columns[df.columns.str.contains("spike|spke")]]
          
          

          【讨论】:

            猜你喜欢
            • 2022-09-28
            • 2015-01-31
            • 2022-07-25
            • 2012-10-19
            • 2020-08-30
            • 1970-01-01
            相关资源
            最近更新 更多