Панды: вернуть имена объектов, если переменная истинна - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть список из ~ 2M строк и список из ~ 800 слов.Я создал фрейм данных со строками в виде строк и слов в виде столбцов.За исключением строковой переменной, все остальные переменные имеют значения true или false, соответствующие тому, находится ли слово в строке.Отсутствуют пропущенные значения.

т.е.

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],})

Я новичок в пандах и выяснил, что могу создать список имен столбцов с пропущенными значениями с помощью следующей команды

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

Есть ли способчто я могу, для каждой строки, аналогичным образом захватывать имена столбцов с определенным значением и представлять его в виде списка?

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

Вы можете проверить

df.eq(True).dot(df.columns+',').str[:-1].str.split()
0     [california,string]
1        [lobster,string]
2    [california,lobster]
dtype: object
0 голосов
/ 03 февраля 2019

Один из приведенных выше ответов делает хорошую работу по созданию строки в скобках из спичек, разделенных запятыми, что действительно полезно.У меня была следующая проблема, когда мне нужно было подсчитать количество совпавших фраз, что сделало более полезным иметь столбец в виде списка, а не строку.

df['matches'] = df.eq(True).dot(df.columns+',').str[:-1].str.split(',')
df['num_matches'] = df['matches'].str.len()
0 голосов
/ 01 февраля 2019

используйте apply с лямбда-выражением:

# 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]  
...