猿问

Pandas:如果变量为真,则返回特征名称

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


IE


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()

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


慕工程0101907
浏览 228回答 3
3回答

收到一只叮咚

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

米琪卡哇伊

使用apply与lambda表达式:# setting axis=1 in apply means you are looking across rowsdf['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]  

RISEBY

上面的一个响应很好地创建了一个由逗号分隔的匹配项的括号字符串,这非常有帮助。我随后遇到了一个问题,我需要计算匹配短语的数量,这使得将列置于列表类型而不是字符串中更有帮助。df['matches'] = df.eq(True).dot(df.columns+',').str[:-1].str.split(',')df['num_matches'] = df['matches'].str.len()
随时随地看视频慕课网APP

相关分类

Python
我要回答