【问题标题】:Pandas: return feature names if variable is truePandas:如果变量为真,则返回特征名称
【发布时间】:2019-06-25 15:35:02
【问题描述】:

我有一个大约 2M 字符串的列表和一个大约 800 个单词的列表。我创建了一个数据框,其中字符串作为行,单词作为列。除字符串变量外,所有其他变量都是对应于单词是否在字符串中的真或假值。没有缺失值。

import pandas as pd
df = pd.DataFrame({'strings':['a string with california', 
                              'a string with lobster', 
                              'a str with california and lobster'],
                         'california':[True,False,True],
                         'lobster':[False,True,True],
                         'string':[True,True,False],})

由于数据框太长太宽,无法一次查看,我想要一个变量来列出对特定行具有真实值的列名。例如,

df_filtered = pd.DataFrame({'strings':['a string with california', 
                              'a string with lobster', 
                              'a str with california and lobster'],
                   'matches':[['string','california'],
                              ['string', 'lobster'],
                              ['california', 'lobster']],
                         'california':[True,False,True],
                         'lobster':[False,True,True],
                         'string':[True,True,False],})

我是 pandas 的新手,我发现我可以使用以下命令创建包含缺失值的列名列表

columns_w_na = df.columns[df.isnull().any()].tolist()

有没有一种方法,我可以为每一行类似地捕获具有特定值的列的名称并将其表示为一个列表?

【问题讨论】:

    标签: python string pandas boolean filtering


    【解决方案1】:

    apply 与 lambda 表达式一起使用:

    # setting axis=1 in apply means you are looking across rows
    df['new'] = df.apply(lambda x: df.columns[x == True].values, axis=1)
    
                                 strings  california  lobster  string  \
    0           a string with california        True    False    True   
    1              a string with lobster       False     True    True   
    2  a str with california and lobster        True     True   False   
    
                         new  
    0   [california, string]  
    1      [lobster, string]  
    2  [california, lobster]  
    

    【讨论】:

      【解决方案2】:

      您可能需要检查

      df.eq(True).dot(df.columns+',').str[:-1].str.split()
      0     [california,string]
      1        [lobster,string]
      2    [california,lobster]
      dtype: object
      

      【讨论】:

      • 谢谢,两个回复都非常有帮助。您的回复特别具有可扩展性
      • @JackReimer yw :-) 快乐编码
      【解决方案3】:

      上面的一个响应很好地创建了一个用逗号分隔的括号中的匹配字符串,这真的很有帮助。我遇到了一个后续问题,我需要计算匹配短语的数量,这使得将列置于列表类型而不是字符串中更有帮助。

      df['matches'] = df.eq(True).dot(df.columns+',').str[:-1].str.split(',')
      df['num_matches'] = df['matches'].str.len()
      

      【讨论】:

        猜你喜欢
        • 2017-07-28
        • 2021-11-02
        • 1970-01-01
        • 2012-10-12
        • 1970-01-01
        • 2022-11-25
        • 2021-03-16
        • 1970-01-01
        • 2017-04-01
        相关资源
        最近更新 更多