найти элемент в списке в datafame - PullRequest
5 голосов
/ 11 июля 2019

У меня есть фрейм данных "df1":

adj           response

beautiful    ["She's a beautiful girl/woman, and also a good teacher."]
good         ["She's a beautiful girl/woman, and also a good teacher."]
hideous      ["This city is hideous, let's move to the countryside."]

И вот список объектов:

object=["girl","teacher","city","countryside","woman"]

Код:

df1['response_split']=df1['response'].str.split(",")

После того, как я разделил его, фрейм данных будет выглядеть так:

adj           response_split

beautiful    ["She's a beautiful girl/woman", " and also a good teacher."]
good         ["She's a beautiful girl/woman", " and also a good teacher."]
hideous      ["This city is hideous", " let's move to the countryside."]

Я хочу добавить еще один столбец «response_object», если они находят в ответе adj, они находят его объект из списка: ожидаемый результат

adj           response_split                                               response_object

beautiful    ["She's a beautiful girl/woman", " and also a good teacher."]        girl
beautiful    ["She's a beautiful girl/woman", " and also a good teacher."]        woman
good         ["She's a beautiful girl/woman", " and also a good teacher."]        teacher
hideous      ["This city is hideous", " let's move to the countryside."]          city

код:

for i in df1['response_split']:
    if df1['adj'] in i:
        if any(x in i and x in object):
            match = list(filter(lambda x: x in i, object))
            df1['response_object']=match

Распечатывается Ошибка значения

1 Ответ

3 голосов
/ 11 июля 2019

Первый object является допустимым Python builtins (кодовое слово), поэтому лучше не использовать его для переменной, здесь он меняется на L:

L=["girl","teacher","city","countryside","woman"]

Затем zip разделенный столбец с adj, цикл по кортежам, цикл по значениям в L и совпадение, если оба совпадают с in и and:

df1['response_split']=df1['response'].str.split(",")
L1 = [(a, b, o) for a, b in zip(df1['adj'], df1['response_split']) 
                for r in b 
                for o in L 
                if (o in r) and (a in r)]

Что следует переписать в циклы:

df1['response_split']=df1['response'].str.split(",")

L1 = []
for a, b in zip(df1['adj'], df1['response_split']):
    for r in b:
        for o in L:
            if (o in r) and (a in r):
                L1.append((a, b, o))

Последнее создание DataFrame конструктор:

df2 = pd.DataFrame(L1, columns=['adj','response_split','response_object'])
print (df2)
         adj                                     response_split  \
0  beautiful  [She's a beautiful girl/woman,  and also a goo...   
1  beautiful  [She's a beautiful girl/woman,  and also a goo...   
2       good  [She's a beautiful girl/woman,  and also a goo...   
3    hideous  [This city is hideous,  let's move to the coun...   

  response_object  
0            girl  
1           woman  
2         teacher  
3            city  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...