Поиск нескольких слов в Python DataFrame / List - PullRequest
1 голос
/ 14 июля 2020

У меня есть список:

list = ['United Kingdom', 'Berlin', 'italy']

и DataFrame:

   location
0  London, United Kingdom
1  BerlinGerman
2  Rome,Italy

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

   location               new_col
0  London, United Kingdom United Kingdom
1  BerlinGerman           Berlin
2  Rome,Italy             italy

Как я могу это сделать?

Ответы [ 5 ]

0 голосов
/ 14 июля 2020

Я не знаю ни одной библиотеки, которая бы делала что-либо подобное, поэтому я бы просто сделал программу. Я позволю вам попробовать разработать свою собственную программу (цель - изучить: P), вот несколько советов, если вы застряли:

Сначала попробуйте получить подстроку (из list), соответствующую заданному местоположению, реализовав, например, функцию getWord(location:str, mylist:list) такую, что:

getWord('London, United Kingdom', list) # Gives 'United Kingdom'
getWord('BerlinGerman', list) # Gives 'Berlin'
# and so on...

Как только это будет сделано, вы просто нужно создать новый столбец, содержащий результат этой функции.

Чтобы выполнить эту функцию, для каждого элемента списка вам нужно будет проверить, является ли он подстрокой местоположения. Вы можете использовать, например, для этого генератор. Вот пример использования:

matches = [x for x in mylist if x < 2] # filter all elements of mylist that are < 2

Просто заменив if x < 2 чем-то немного умным, большая часть вашей функции будет выполнена ;-) Обратите внимание: если вы хотите, чтобы italy совпадал с Italy (даже если один из них имеет заглавную букву), рекомендуется использовать .lower().

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

0 голосов
/ 14 июля 2020
import pandas as pd

list1 = ['United Kingdom', 'Berlin', 'italy']
data= {'location' : [['London', 'United Kingdom'], ['Berlin', 'Germany'], ['Rome', 'italy']]}
df = pd.DataFrame(data=data)
df['new_col'] = 'mutual'

for i in range(len(df['location'])):
    for ele in list1:
        if ele in df['location'][i]:
            df['new_col'][i] = ele
        else:
            continue
print(df)
0 голосов
/ 14 июля 2020

Вы можете определить функцию для поиска и преобразования «длинного имени» в более короткое имя из списка и использовать ее для применения к новому столбцу в фрейме данных!

def search(row):
    mylist = ['United Kingdom', 'Berlin', 'italy']
    for i in range(len(mylist)):
        if mylist[i].lower() in row['location'].lower():
            return mylist[i]
    return ""

df['new_col'] = df.apply(lambda row: search(row), axis=1)

Исходный фрейм данных:

                 location
0  London, United Kingdom
1            BerlinGerman
2              Rome,Italy
3               Singapore

Результирующий фрейм данных:

                 location         new_col
0  London, United Kingdom  United Kingdom
1            BerlinGerman          Berlin
2              Rome,Italy           italy
3               Singapore

Обратите внимание, что функция возвращает пустую строку, если поиск не дал результатов, в данном случае для строки «Сингапур».

0 голосов
/ 14 июля 2020

Вы можете просто назначить список столбцу. Исходный фрейм данных enter image description here

After assigning to new column

a = ['United Kingdom', 'Berlin', 'italy']
df['new_col'] = a

введите описание изображения здесь

После обновления

0 голосов
/ 14 июля 2020

Предполагая, что вы забыли заглавную букву I на Italy, вы можете создать new_col с

import pandas as pd
import re

list = ['United Kingdom', 'Berlin', 'Italy']
df = pd.DataFrame({'location': ['London, United Kingdom', 'BerlinGerman', 'Rome,Italy']})

df['new_col'] = df['location'].apply(lambda x: re.findall('|'.join(list), x)[0])

Вывод

                 location         new_col
0  London, United Kingdom  United Kingdom
1            BerlinGerman          Berlin
2              Rome,Italy           Italy
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...