#python #pandas #dataframe #lambda
#python #pandas #фрейм данных #лямбда
Вопрос:
Я пытаюсь сравнить слова или укусы в 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(' ')]))
ошибка
Ошибка типа: индексы строк должны быть целыми числами
Ответ №1:
Используйте 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
Ответ №2:
Здесь не нужно использовать лямбда-функцию, просто проверьте, содержится ли каждое слово в строке того же столбца. Функция 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]
Ответ №3:
Проверьте с
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