You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:33:07