循环数据帧查找字符串值时。如果多次找到搜索词,如何打印行而不重复?

问题描述 投票:0回答:1

我正在导入 pandas 并读取 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 包含以下内容:

商品编号 用户名 长描述 简短描述 评论
ITM-1 莱昂纳多 一堆包含一堆东西的单词 文字和东西 我写了字
ITM-2 多纳泰罗 天哪,这家伙甚至没有以正确的格式表达,但至少他写了文字。 人和言语 不适用
ITM-3 弗兰克 Windows、SQL、RedHat、RHEL、垃圾 技术清单 技术栈

搜索“技术”一词预期输出:

商品编号 用户名 简短描述
ITM-3 弗兰克 技术清单

由于循环,实际输出如下,因为在“简短描述”和“评论”字段中都找到了搜索词:

商品编号 用户名 简短描述
ITM-3 弗兰克 技术清单
商品编号 用户名 简短描述
ITM-3 弗兰克 技术清单

我尝试了

.drop_duplicates
的多种变体,但我知道我不知道如何使用它,因为我对它在整个代码中的位置了解有限。

pandas dataframe loops duplicates
1个回答
0
投票

您可以使用

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
© www.soinside.com 2019 - 2024. All rights reserved.