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

过滤后的Pandas DataFrame无法用于for循环?问题求助

问题原因与解决方案

核心问题

过滤后的DataFrame索引不再是连续的0起始整数序列了。

原始DataFrame从CSV读取后,默认索引是0、1、2...连续递增的,所以你用range(len(dat_fbjk['x']))生成的数字,刚好能匹配df的标签索引,dat_fbjk['x'][x]能正常取值。但过滤后,pass_500只保留了符合条件的行,这些行的索引还是沿用原始df的标签(比如原始df里符合条件的行是索引3、5、7,那pass_500的索引就是3、5、7),此时你用range(len(pass_500['x']))生成0、1、2...,再用pass_500['x'][0]去访问,自然找不到标签为0的行,就会报KeyError: 0。

三种解决办法

  1. 重置索引
    过滤后直接重置索引,让它变回0起始的连续整数:
filt_1 = (dat_fbjk['type/displayName'] == 'Pass') & (dat_fbjk['teamId'] == 500)
pass_500 = dat_fbjk[filt_1].reset_index(drop=True)

drop=True是删掉原来的旧索引列,避免冗余。之后原来的循环代码就能正常运行。

  1. 用位置索引iloc
    不修改索引,而是在取值时用iloc按位置访问(不管标签索引是什么):
for x in range(len(pass_500['x'])):
    plt.plot((pass_500['x'].iloc[x], pass_500['endX'].iloc[x]), 
             (pass_500['y'].iloc[x], pass_500['endY'].iloc[x]), 
             color='green')
  1. 改用更高效的Pandas风格写法(推荐)
    避免手动循环,用apply或者向量化操作,代码更简洁且效率更高:
pass_500.apply(lambda row: plt.plot((row['x'], row['endX']), 
                                    (row['y'], row['endY']), 
                                    color='green'), 
               axis=1)

内容的提问来源于stack exchange,提问作者PaiThon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:15:42