筛选产品最后版本时,向DataFrame的iloc传字符串报错求助
解决iloc索引报错并优化产品最新版本筛选逻辑
首先得明确你遇到问题的核心:你把整数列表转成了逗号分隔的字符串productIndexStr,但iloc只接受整数、整数切片或者整数列表/数组这类类型,字符串完全不符合要求,所以才会触发ValueError;而直接用ProductDf[productIndexStr]是在按列名索引,你的数据里显然没有名为'7,8'的列,自然就抛出KeyError了。
先快速修复当前的索引问题
其实你完全不需要把productIndex转成字符串,直接用这个整数列表传给iloc就可以正常运行:
# 直接用整数列表,跳过转字符串的步骤 filteredProductDf = ProductDf.iloc[productIndex, :]
这样就和你手动传入[7,8]的效果完全一致了。
再优化你的原始筛选逻辑(更简洁高效)
你原来的代码通过多次分组、重置索引来获取目标行,步骤有点繁琐,其实用Pandas原生的方法就能直接拿到每个产品的最后迭代版本,还能避免手动处理索引的麻烦:
方法1:用groupby + idxmax直接定位最新版本
startDtTime的最大值对应的行就是每个产品的最新迭代,idxmax可以直接返回这些行的索引,然后用loc筛选即可:
# 获取每个productId对应最新startDtTime的行索引 latest_row_indices = ProductDf.groupby('productId')['startDtTime'].idxmax() # 直接筛选出这些行 filteredProductDf = ProductDf.loc[latest_row_indices]
方法2:排序后去重,保留每组第一行
先按产品ID分组,每组内按时间降序排序,然后只保留每个产品的第一行(也就是最新版本):
# 先按productId升序、startDtTime降序排序,再去重保留每组第一行 filteredProductDf = ProductDf.sort_values( by=['productId', 'startDtTime'], ascending=[True, False] ).drop_duplicates(subset='productId', keep='first')
这两种方法都比你原来的代码更简洁,运行效率也更高,还能减少手动处理索引带来的出错概率。
再复盘下你的错误原因
- 当你把整数列表转成
"7,8"这样的字符串后,iloc会把它当成一个单独的索引值去查找,而不是两个整数,完全不符合iloc的参数要求,所以触发了ValueError。 - 用
ProductDf["7,8"]时,Pandas默认是按列名查找,你的DataFrame里没有这个列,所以抛出KeyError。
内容的提问来源于stack exchange,提问作者Manish
相关产品推荐
相关产品推荐

