У меня есть dataframe с двумя столбцами, last_name
и description
Каков элегантный способ увидеть, содержит ли description
last_name
в каждой строке?
У меня есть уродливый
for i in range(0,len(df0)):
df0['last_name_position'].loc[i] = \
df0['description'].loc[i].find(df0['last_name'].loc[i])
Бег.
Это в основном та же задача, что и https://exceljet.net/formula/cell-contains-specific-text
Тот же результат может быть достигнут с помощью df.apply
:
df0['last_name_position'] = \
df0.apply(lambda x: x.description.find(x.last_name), axis=1)
Если вам не нужно найти индекс подстроки:
df0['last_name_position'] = \
df0.apply(lambda x: x.last_name in x.description, axis=1)
Сохранение данных:
import pandas as pd
a = pd.DataFrame([['Smith','Some description'],['Jones','Some Jones description']], columns=['last_name','description'])
a['Match']=a.apply(lambda x: x['last_name'] in x['description'], axis=1)
a.head()
last_name description Match
0 Smith Some description False
1 Jones Some Jones description True
Что может быть лучше, это перебрать строки, используя индекс. Затем сделайте ваше сравнение, используя in
ключевом слове:
import pandas as pd
a = pd.DataFrame([['Smith','Some description'],['Jones','Some Jones description']], columns=['last_name','description'])
for rname in a.index:
row = a.loc[rname]
it_contains = row['last_name'] in row['description']
print "Description contains last name:", it_contains
# Outputs:
# Description contains last name: False
# Description contains last name: True
pd.DataFrame.apply
и pd.Series.apply
, которые делают это избыточным.