过滤后的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。
三种解决办法
- 重置索引
过滤后直接重置索引,让它变回0起始的连续整数:
filt_1 = (dat_fbjk['type/displayName'] == 'Pass') & (dat_fbjk['teamId'] == 500) pass_500 = dat_fbjk[filt_1].reset_index(drop=True)
drop=True是删掉原来的旧索引列,避免冗余。之后原来的循环代码就能正常运行。
- 用位置索引
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')
- 改用更高效的Pandas风格写法(推荐)
避免手动循环,用apply或者向量化操作,代码更简洁且效率更高:
pass_500.apply(lambda row: plt.plot((row['x'], row['endX']), (row['y'], row['endY']), color='green'), axis=1)
内容的提问来源于stack exchange,提问作者PaiThon
相关产品推荐
相关产品推荐

