如何在DataFrame中根据子串查找并返回对应单元格的值?
解决方案
首先纠正你现有代码里的几个语法错误,避免运行报错:
- 中文引号
“”要改成英文引号"" - Python布尔值
false要大写为False any是方法,需要加括号调用(原代码里.any是引用方法对象,不是执行判断)
修正后的行筛选代码:
df[df.apply(lambda row: row.astype(str).str.contains("Apple", case=False).any(), axis=1)]
修正后的列筛选代码:
df.apply(lambda x: x.str.contains("Apple", case=False).any())
下面是两种获取目标单元格完整值的方法:
方法一:转为一维Series筛选(推荐)
把整个DataFrame扁平化处理,直接筛选包含目标子串的单元格值:
import pandas as pd # 示例DataFrame data = { "Column A": ["Red apple", "Blue Car"], "Column B": ["carrots", "Banana"] } df = pd.DataFrame(data) target_substring = "Apple" # 将DataFrame转为一维Series(stack()会把列作为二级索引) all_cells = df.stack() # 筛选包含子串的单元格,忽略大小写 matched_values = all_cells[all_cells.astype(str).str.contains(target_substring, case=False)].tolist() print(matched_values) # 输出: ['Red apple']
方法二:逐单元格遍历
通过嵌套循环遍历每个单元格,收集符合条件的值:
matched_values = [] target_substring_lower = target_substring.lower() # 遍历每一行 for _, row in df.iterrows(): # 遍历该行的每个单元格值 for val in row.astype(str): if target_substring_lower in val.lower(): matched_values.append(val) # 可选:去重(如果存在重复匹配的情况) matched_values = list(dict.fromkeys(matched_values)) print(matched_values) # 输出: ['Red apple']
如果需要同时获取单元格的位置(行索引、列名),可以在方法一中保留索引:
matched_cells = all_cells[all_cells.astype(str).str.contains(target_substring, case=False)] print(matched_cells) # 输出: # 0 Column A Red apple # dtype: object
内容的提问来源于stack exchange,提问作者Lama
相关产品推荐
相关产品推荐

