Python遍历DataFrame列表结合startswith匹配截取对应列的问题
问题原因
- 循环逻辑错误:当前使用嵌套循环会让每个DataFrame重复匹配所有前缀组,且后续赋值会覆盖之前的结果,不符合「DataFrame和前缀组索引一一对应」的需求
- 匹配参数错误:
str.startswith支持传入元组实现多前缀同时匹配,你直接把前缀列表转成字符串传入,会匹配"['a', 'b']"这种无意义的字符串,自然选不到任何列
修复后代码
import pandas as pd # 测试数据定义 df1 = pd.DataFrame(data={'x':[1,2,3,4,5], 'am.1': [1,1,1,1,1], 'abn.1': [1,1,1,1,1], 'b1c': [1,1,1,1,1], 'b1d': [1,1,1,1,1]}) df2 = pd.DataFrame(data={'x':[1,2,3,4,5], 'am.1': [1,1,1,1,1], 'al.2': [1,1,1,1,1], 'b1d': [1,1,1,1,1], 'b2d': [1,1,1,1,1]}) lst_dfs = [df1, df2] lst = (['a','b'],['am','b1']) # 处理逻辑 dat = {} for idx, df in enumerate(lst_dfs): # 取对应索引的前缀组,转元组后传入startswith做多前缀匹配 prefixes = tuple(lst[idx]) dat[idx] = df.loc[:, df.columns.str.startswith(prefixes)]
结果验证
dat[0]为df1匹配所有a/b开头的列,包含:am.1、abn.1、b1c、b1ddat[1]为df2匹配所有am/b1开头的列,包含:am.1、b1d
内容的提问来源于stack exchange,提问作者b101
相关产品推荐
相关产品推荐

