Удалить строки из столбца во фрейме данных для каждой строки, которых нет в списке - PullRequest
1 голос
/ 10 марта 2019

Скажем, у меня есть список слов:

listOfWords = ['Apple','Orange','Banana','Potato']

И мой фрейм данных выглядит следующим образом:

In:

ColumnA:
['Apple','Turnip','Banana','Potato']
['Apple','Orange','Banana','Potato']
['Apple','Orange','Pastry','Potato']
['Melon','Orange','Banana','Potato']
['Apple','Orange','Banana','Sandwich']

В настоящее время я выполняю следующий код для получения желаемого результата

for index, row in df.iterrows():
    for word in df['Column']:
        if word not in listOfWords:
            word.replace(word,"")



Out:

ColumnA:
    ['Apple','Banana','Potato']
    ['Apple','Orange','Banana','Potato']
    ['Apple','Orange','Potato']
    ['Orange','Banana','Potato']
    ['Apple','Orange','Banana']

В настоящее время я запускаю это на 12 000 записей и список длиной 12 000.Он работал без ошибок в течение нескольких часов, однако я не уверен, является ли это наиболее эффективным способом сделать это.

1 Ответ

1 голос
/ 10 марта 2019

Использовать понимание списка в apply или во вложенном list comprehension:

df['ColumnA']= df['ColumnA'].apply(lambda x: [y for y in x if y in listOfWords]) 
#another solution
#df['ColumnA'] = [[y for y in x if y in listOfWords] for x in df['ColumnA']]
print (df)
                           ColumnA
0          [Apple, Banana, Potato]
1  [Apple, Orange, Banana, Potato]
2          [Apple, Orange, Potato]
3         [Orange, Banana, Potato]
4          [Apple, Orange, Banana]

Или, если заказ не импортирован, используйте set с пересечением:

s = set(listOfWords)
df['ColumnA']= df['ColumnA'].apply(lambda x: list(set(x) & s))
print (df)
                           ColumnA
0          [Banana, Potato, Apple]
1  [Banana, Potato, Orange, Apple]
2          [Potato, Orange, Apple]
3         [Banana, Potato, Orange]
4          [Banana, Orange, Apple]
...