根据列表匹配字符串提取Excel指定列内容及代码报错求助
根据列表匹配字符串提取Excel指定列内容及代码报错求助
看起来你是想通过匹配表格里的Location列和给定的字符串列表,提取对应行的Cell type、treatment、Field 1、Field 2信息对吧?先来说说你遇到的报错问题,再给你更简洁的实现方式。
为什么你的代码会报错?
你写的exp[indices_true, 'Field 1']这种索引方式在pandas里是不合法的——pandas的DataFrame不能直接用[行索引列表, 列名]这种格式来取值,正确的做法应该用.loc或者.iloc来指定行和列。另外,如果indices_true是空列表(也就是当前遍历的subfolders_name[i]在Location列里没有匹配项),就会触发InvalidIndexError,因为没有对应的行可以选取。
更简洁高效的实现方法
其实不用手动写循环判断每一项,pandas自带的isin()方法可以帮你快速筛选出所有匹配的行,之后再遍历提取信息就好:
# 假设exp是你的pandas DataFrame,subfolders_name是目标字符串列表 # 第一步:筛选出Location在列表中的所有行 matched_data = exp[exp['Location'].isin(subfolders_name)] # 第二步:遍历每一行匹配到的数据,提取需要的字段 for _, row in matched_data.iterrows(): cell_type = row['Cell type'] treatment = row['treatment'] field_1 = row['Field 1'] field_2 = row['Field 2'] # 这里可以根据需求打印、存储或者做其他操作 print(f"cell_type={cell_type}") print(f"treatment={treatment}") print(f"field_1={field_1}") print(f"field_2={field_2}") print("---")
如果你需要逐个检查列表里的每个字符串(比如要知道哪些字符串没有匹配到),可以这样写:
for folder_name in subfolders_name: # 筛选当前字符串对应的行 single_match = exp[exp['Location'] == folder_name] if not single_match.empty: # 取匹配到的第一行(如果有多个匹配,可改成遍历) row = single_match.iloc[0] cell_type = row['Cell type'] treatment = row['treatment'] field_1 = row['Field 1'] field_2 = row['Field 2'] print(f"匹配到 {folder_name}:") print(f"cell_type={cell_type}") print(f"treatment={treatment}") print(f"field_1={field_1}") print(f"field_2={field_2}") else: print(f"未找到与 {folder_name} 匹配的记录")
补充说明
- 用
isin()可以一次性筛选所有匹配项,比循环逐个判断效率高很多,尤其是数据量大的时候。 - 一定要注意处理“没有匹配到”的情况,比如用
empty属性判断,避免因为空DataFrame操作报错。
备注:内容来源于stack exchange,提问作者Camelia Mocanu
相关产品推荐
相关产品推荐

