панды сравнивают 2 столбца и сохраняют только совпадающие слова - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь сравнить слова или строки в 1 столбце данных с другим столбцом в той же самой df и вывести 3-й столбец только с соответствующими словами.

input
Col1
the cat crossed a road
the dog barked
the chicken barked

Col2
the cat alligator
some words here
chicken soup

desired result
Col3
the cat
NULL
chicken

Это то, что у меня есть, но я получаюошибка.

df[Col3] = df[Col1].apply(lambda x: ' '.join([word for word in x.split() if word in x[Col2].split(' ')]))

ошибка: ошибка типа: строковые индексы должны быть целыми числами

Ответы [ 3 ]

1 голос
/ 05 апреля 2019

Используйте apply, с ' '.join, а затем используйте понимание списка, чтобы получить значения, соответствующие

Кроме того, вы должны использовать axis=1 для его работы:

print(df.apply(lambda x: ' '.join([i for i in x['Col1'].split() if i in x['Col2'].split()]), axis=1))

Выход:

0    the cat
1           
2    chicken
dtype: object

Если вы хотите NULL, вместо простого значения используйте:

print(df.apply(lambda x: ' '.join([i for i in x['Col1'].split() if i in x['Col2'].split()]), axis=1).str.replace('', 'NULL'))

Выход:

0    the cat
1    NULL
2    chicken
dtype: object
0 голосов
/ 05 апреля 2019

Нет необходимости использовать лямбда-функцию здесь, просто проверьте, содержится ли каждое слово в строке того же столбца.Функция zip () может быть очень полезна для итераций столбцов.Вот один из способов сделать это:

import pandas as pd

data_frame = pd.DataFrame(
    {'col1':{
        1:'the cat crossed a road',
        2:'the dog barked',
        3:'the chicken barked',},
    'col2':{
        1: 'the cat alligator',
        2: 'some words here',
        3: 'chicken soup'}}
)

# output the overlap as a list
output = [
    [word for word in line1.split() if word in line2.split()] 
    for line1, line2 in zip(data_frame['col1'].values, data_frame['col2'].values)
]

# To add your new values a column
data_frame['col3'] = output

# Or, if desired, keep as a list and remove empty rows 
output = [row for row in output if row]
0 голосов
/ 05 апреля 2019

Проверка с

l=[' '.join([t for t in x if t in y]) for x, y in zip(df1.Col1.str.split(' '),df2.Col2.str.split(' '))]
pd.DataFrame({'Col3':l})
Out[695]: 
      Col3
0  the cat
1         
2  chicken
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...