if-elif循环出现KeyError:多列数值倍数判断逻辑报错求助
解决Pandas KeyError并实现列值倍数匹配需求
首先说你的KeyError问题:大概率是代码里用数字1、2去索引列,但你的DataFrame列名根本不是这些数字!毕竟你是用pd.concat合并三个Series,它们的列名可能是各自的name属性(比如你没设置的话,可能默认是0、1、2,但如果reset_index操作后,会不会和新生成的index列混淆?或者你合并的Series本身有自定义列名,比如叫percent1之类的字符串),这时候用数字去取列肯定会报错。
给你一个更靠谱、更高效的解决方案,直接用Pandas的向量化操作(比循环快得多,尤其是数据量大的时候),完美匹配你的需求:
步骤1:构造示例数据(和你的需求对应)
import pandas as pd # 模拟你的输入数据,行索引是A/G/K/T,三列数值 data = [[1,2,3], [2,3,4], [1,1,2], [1,1,1]] percentage = pd.DataFrame(data, index=['A','G','K','T'])
步骤2:编写匹配逻辑
我们需要检查所有列对的两种情况:甲列是乙列的两倍,或者乙列是甲列的两倍,只要满足任意一种就把该行索引加入列表。
# 生成所有需要检查的列对(避免重复检查,比如只检查(0,1)不重复检查(1,0)) column_pairs = [(0,1), (0,2), (1,2)] # 初始化一个全False的Series,用来标记满足条件的行 match_mask = pd.Series([False]*len(percentage)) # 遍历每一对列,更新匹配标记 for col_a, col_b in column_pairs: # 检查两种倍数情况 cond1 = percentage.iloc[:, col_a] == 2 * percentage.iloc[:, col_b] cond2 = percentage.iloc[:, col_b] == 2 * percentage.iloc[:, col_a] # 只要满足其中一种,就把该行标记为True match_mask = match_mask | cond1 | cond2 # 提取满足条件的行索引,转成列表 AA = percentage[match_mask].index.tolist() print(AA) # 输出正好是你要的 ['A', 'G', 'K']
如果你已经执行了reset_index怎么办?
如果你的DataFrame已经用reset_index()把原来的行索引变成了index列,只要稍作调整即可:
# 假设你已经执行了reset_index percentage = percentage.reset_index() # 取所有数值列(排除第一列的index) data_cols = percentage.iloc[:, 1:] column_pairs = [(0,1), (0,2), (1,2)] match_mask = pd.Series([False]*len(percentage)) for col_a, col_b in column_pairs: cond1 = data_cols.iloc[:, col_a] == 2 * data_cols.iloc[:, col_b] cond2 = data_cols.iloc[:, col_b] == 2 * data_cols.iloc[:, col_a] match_mask = match_mask | cond1 | cond2 # 从index列提取结果 AA = percentage[match_mask]['index'].tolist()
为什么你的原循环会报错?
你原代码里用percentage[1][i]这种写法,本质是先按列名取列1,再按位置取第i行。但如果你的列名不是整数1(比如合并后的列名是字符串),就会触发KeyError。而用iloc[:, col_index]是按位置取列,完全不受列名影响,能彻底避免这个问题。
内容的提问来源于stack exchange,提问作者AST
相关产品推荐
相关产品推荐

