如何在Pandas中从行索引不固定的列提取指定值?
优化Pandas提取特定前缀值的简洁实现
直接利用Pandas的向量化字符串操作,能替代原有的嵌套循环,让代码更简洁高效,同时严谨处理空字符串、NaN等特殊情况。
方法1:布尔索引+去重(通用场景)
import pandas as pd file1 = {'Col1' : ['', '', 'K_ABC', '', '', '']} file2 = {'Col1' : ['', 'K_DEF', '', '', '', '']} file3 = {'Col1' : ['', '', '', 'K_GHI', '', '']} files = [file1, file2, file3] for foo in files: df = pd.DataFrame(foo) # 筛选以'K_'开头的行,自动排除NaN和空字符串,再去重 target_vals = df['Col1'].loc[df['Col1'].str.startswith('K_', na=False)].unique() for val in target_vals: print(val)
str.startswith('K_', na=False):na=False参数让NaN值被标记为False,不会混入结果- 直接通过布尔索引定位目标行,再用
unique()去重,省去手动遍历唯一值的嵌套循环
方法2:正则提取(单目标值场景)
如果每个文件的目标列里只有一个以'K_'开头的值,可以用正则提取进一步简化:
for foo in files: df = pd.DataFrame(foo) # 提取以K_开头的完整字符串,过滤空值后取第一个结果 target_val = df['Col1'].str.extract(r'(K_.+)', expand=False).dropna().iloc[0] print(target_val)
- 正则
(K_.+)精准匹配以'K_'开头的任意长度字符串 dropna()清理无效值,iloc[0]直接获取唯一目标值
方法3:真实Excel文件批量处理
如果是处理本地Excel文件,建议只加载目标列提升效率:
# 替换为你的Excel文件路径列表 excel_paths = ['file1.xlsx', 'file2.xlsx', 'file3.xlsx'] for path in excel_paths: # 只加载需要的Col1列,节省内存 df = pd.read_excel(path, usecols=['Col1']) target_vals = df['Col1'].loc[df['Col1'].str.startswith('K_', na=False)].unique() for val in target_vals: print(val)
原代码的优化点
- 去掉嵌套循环,代码结构更清晰,维护成本更低
- Pandas的向量化操作比Python原生循环效率高得多,处理大文件时优势明显
- 显式处理NaN和空字符串,逻辑更严谨,避免潜在bug
内容的提问来源于stack exchange,提问作者Kai
相关产品推荐
相关产品推荐

