У меня проблема с поиском строк DataFrame, где два столбца содержат часть заданной строки s.
Значения столбца (тип String(Object))
Я имею в виду противоположность str.contains или isin(), потому что маска подстроки — это значение столбца.
Строка не подходит для четкого разделения, поскольку три значения «Название города», «Название района» и «Название улицы» могут содержать пробелы.
Вы можете помочь мне?
s = "Bad Testcity Teststr."
df_res = df.loc[(s.find(df['CITY'] != -1) & (s.find(df['DISTRICT'] != -1) & (s.find(df['STREET'] != -1)]`
Этот образец должен вернуть TRUE.
<bound method DataFrame.info of ZIP CITY STREET NUMBER NUMBER_SFX DISTRICT ONKZ ASB ADSL VDSL VDSL_SV VPSZ OUTDOOR
ID
4025217 12345 Bad Testcity Teststr. 6 NaN Bad Testcity 12345 2 +017.696 +102.784 NaN 49/12345/30 O
4025219 12345 Bad Testcity Teststr. 7 NaN Bad Testcity 12345 2 +017.696 +102.784 NaN 49/12345/30 O
4025242 12345 Bad Testcity Teststr. 8 NaN Bad Testcity 12345 2 +017.696 +102.784 +185.824 49/12345/30 O
4025244 12345 Bad Testcity Teststr. 10 NaN Bad Testcity 12345 2 +017.696 +102.784 NaN 49/12345/30 O
4025245 12345 Bad Testcity Teststr. 11 NaN Bad Testcity 12345 2 +017.696 +051.392 NaN 49/12345/30 O
... ... ... ... ... ... ... ... .. ... ... ... ... ...
[1569530 rows x 13 columns]>
и какой именно текст вы хотите найти в столбцах?
Обычно я создаю новый логический столбец с нужной вам логикой, а затем фильтрую его. Если вам не нужен этот столбец, вы можете удалить его.
Я отредактировал строку поиска и опубликовал структуру DF.
@ Chinny84: Хорошо, но проблема все та же. Как мне сформулировать условия для этой логики?
df_res = df[df.apply(лямбда-строка: s в строке['CITY'] и s в строке['DISTRICT'], axis=1)] вам необходимо изменить лямбда-функцию внутри метода apply. В этой измененной строке мы проверяем, присутствует ли подстрока s в столбцах CITY и DISTRICT для каждой строки в DataFrame. Отрегулируйте эту строку в соответствии с вашими требованиями.






Предполагая этот ввод:
ZIP CITY STREET NUMBER NUMBER_SFX DISTRICT ONKZ ASB ADSL VDSL VDSL_SV VPSZ OUTDOOR
ID
4025217 12345 Bad Testcity Teststr. 6 NaN Bad Testcity 12345 2 17.696 102.784 NaN 49/12345/30 O
4025219 12345 Bad Testcity Teststr. 7 NaN Bad Testcity 12345 2 17.696 102.784 NaN 49/12345/30 O
4025242 12345 Bad Testcity Teststr. 8 NaN Bad Testcity 12345 2 17.696 102.784 185.824 49/12345/30 O
4025244 12345 Bad Testcity Teststr. 10 NaN Bad Testcity 12345 2 17.696 102.784 NaN 49/12345/30 O
4025245 12345 Bad Testcity Teststr. 11 NaN Bad Testcity 12345 2 17.696 51.392 NaN 49/12345/30 O
Вы можете объединить столбцы через пробел, а затем использовать str.contains на выходе:
s = "Bad Testcity Teststr."
df_res = df.loc[(df['CITY']+' '+df['DISTRICT']+' '+df['STREET']).str.contains(s)]
Менее эффективная альтернатива (тем не менее может быть полезна):
df_res = df.loc[df[['CITY', 'DISTRICT', 'STREET']]
.apply(' '.join, axis=1)
.str.contains(s)]
Вывод (здесь без изменений):
ZIP CITY STREET NUMBER NUMBER_SFX DISTRICT ONKZ ASB ADSL VDSL VDSL_SV VPSZ OUTDOOR
ID
4025217 12345 Bad Testcity Teststr. 6 NaN Bad Testcity 12345 2 17.696 102.784 NaN 49/12345/30 O
4025219 12345 Bad Testcity Teststr. 7 NaN Bad Testcity 12345 2 17.696 102.784 NaN 49/12345/30 O
4025242 12345 Bad Testcity Teststr. 8 NaN Bad Testcity 12345 2 17.696 102.784 185.824 49/12345/30 O
4025244 12345 Bad Testcity Teststr. 10 NaN Bad Testcity 12345 2 17.696 102.784 NaN 49/12345/30 O
4025245 12345 Bad Testcity Teststr. 11 NaN Bad Testcity 12345 2 17.696 51.392 NaN 49/12345/30 O
как выглядит ваш фрейм данных?