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

筛选产品最后版本时,向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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:14:30