Я импортирую панд и читаю CSV-файл.
import pandas as pd
df = pd.read_csv(r'C:\Users\Me\MyFile.csv')
Я конвертирую фрейм данных в строки и делаю содержимое строчными буквами.
df_low = df.apply(lambda x: x.astype(str).str.lower() if (x.dytpe == 'object'_ else x)
Я использую пользовательский ввод для поиска строк
searchterm = str(input("Enter search term: ").lower())
цикл по кадру данных и создание маски, а затем возврат только непустых результатов. В настоящее время я использую команду .upper
только из-за того, что «Номер позиции» имеет 3 заглавные буквы в начале, но, конечно, это делает весь выходной капитал, но это работоспособно.
for item in df_low:
mask = df_low[item].str.contains(searchterm)
df_mask = pd.DataFrame(df_low[mask])
if not df_mask.empty:
print(df_mask[['Item Number', 'User Name', 'Short Description']].to_string(index=false).upper())
если df содержит следующее:
Ожидаемый результат при поиске термина «технология»:
Из-за цикла фактический результат будет следующим, поскольку поисковый запрос находится как в полях «Краткое описание», так и в полях «Комментарии»:
Я попробовал несколько вариантов .drop_duplicates
, но знаю достаточно, чтобы знать, что не знаю, как это использовать, потому что у меня ограниченное понимание того, где это будет в общем коде.
str(input())
является избыточным, поскольку input()
возвращает строку. Избавьтесь от звонка str
.
Колонка Long Description
кажется неактуальной и просто занимает место. Пожалуйста, удалите его. Для справки см. Минимальный воспроизводимый пример и Как сделать хорошие воспроизводимые примеры панд.
pd.DataFrame(df_low[mask])
является избыточным, поскольку df_low[mask]
уже является df. Избавьтесь от звонка pd.DataFrame
.
Все это форматирование вывода не имеет отношения к проблеме, и на первый взгляд меня смутило то, что в выводе «технология» присутствует только один раз в строке. Просто сделайте print(df_mask)
.
«В настоящее время я использую команду .upper только потому, что «Номер элемента» имеет 3 заглавные буквы в начале». Если вам нужна исходная заглавная буква, примените маску к df
вместо df_low
: df_mask = df[mask]
Этот вопрос, по сути, является дубликатом: Самый краткий способ выбора строк, в которых любой столбец содержит строку в фрейме данных Pandas? Я только что опубликовал там свой ответ кстати.
Обратите внимание на pandas «без учета регистра» в строке или «игнорировать регистр». Во-первых, вам не нужно конвертировать в нижний регистр.
Вместо цикла вы можете использовать applymap
для фильтрации строк, в любом столбце которых есть searchterm
:
searchterm = "Technology"
out = df[
df.applymap(lambda x: isinstance(x, str) and searchterm.lower() in x.lower())
.any(axis=1)
]
out = out[["Item Number", "User Name", "Short Description"]]
Item Number User Name Short Description
2 ITM-3 Frank Technology list
Большое спасибо @e-motta. Я совершенно не знаком с тем, как работают лямбда-функции, поэтому поработаю над этим еще немного. Я ценю ваш ответ, и он сработал так, как задумано. Еще раз спасибо.
Это не очень идиоматический способ сделать это. Посмотрите Самый краткий способ выбора строк, в которых любой столбец содержит строку в фрейме данных Pandas? и панды «без учета регистра» в строке или «игнорировать регистр».
(x.dytpe == 'object'_
- Исправьте, пожалуйста, опечатки.