如何按DataFrame列条件将对应值加入列表?代码报错求助
解决Pandas KeyError:无法访问Y列对应行值的问题
嘿,我一眼就看到问题出在哪了——你在y_values.append(df[y_column][row])这里犯了个典型的Pandas索引错误!
错误原因
row是你从df[x_column]里拿到的X列的具体数值(比如报错里的291061),但你用它去索引Y列的时候,Pandas会把它当成DataFrame的行索引来查找。如果你的DataFrame行索引不是X列的数值(比如默认的0、1、2…这种自增索引),那肯定找不到对应的行,自然就抛出KeyError了。
修复方案
给你两种靠谱的解决办法,按需选择:
方法1:用iterrows()遍历每一行(适合小数据集)
这种方式能直接拿到每一行的完整数据,同时获取X和Y的值,不会搞混索引:
df = customer_codes x_column = 'X' y_column = 'Y' num_intervals = 10 maximum = df[x_column].max() interval = maximum/num_intervals intervals = [] i = 0 while i <= num_intervals: value = int(i * interval) intervals.append(value) i = i + 1 # 记得先初始化列表! x_values = [] y_values = [] # 改用iterrows遍历,拿到每行的索引和数据 for _, row_data in df.iterrows(): current_x = row_data[x_column] for interval in intervals: if current_x >= interval: x_values.append(current_x) y_values.append(row_data[y_column])
方法2:用Pandas布尔索引(更高效,推荐大数据集)
Pandas天生适合向量化操作,循环遍历行效率很低,用布尔筛选能快很多:
df = customer_codes x_column = 'X' y_column = 'Y' num_intervals = 10 maximum = df[x_column].max() interval = maximum/num_intervals # 用列表推导式简化interval生成 intervals = [int(i * interval) for i in range(num_intervals + 1)] x_values = [] y_values = [] for interval in intervals: # 直接筛选出X列大于等于当前interval的所有行 filtered_rows = df[df[x_column] >= interval] # 把筛选后的X、Y值批量加入列表 x_values.extend(filtered_rows[x_column].tolist()) y_values.extend(filtered_rows[y_column].tolist())
额外提醒
看你的代码逻辑,同一个X值可能会被多次加入列表(比如它会满足>=0、>=interval、>=2*interval等多个条件),如果这不是你想要的(比如你是想把X值分到对应的区间里),那可能需要调整判断逻辑,比如用pd.cut()来做区间划分,这样能更精准地分组。
内容的提问来源于stack exchange,提问作者Brendan Hughes
相关产品推荐
相关产品推荐

