pandas使用groupby多列分组求和触发TypeError错误如何解决?
报错原因及解决方法
报错根源排查
这个报错TypeError: list indices must be integers or slices, not str通常由两类问题导致:
- 第一类是你当前操作的
df1并不是pandas DataFrame类型,而是Python列表类型,列表不支持字符串作为索引取值,你可以先运行print(type(df1))验证类型。如果确实是列表,先将其转为DataFrame:import pandas as pd # 假设你的列表结构是符合表结构的二维列表/字典列表 df1 = pd.DataFrame(df1) - 第二类是赋值逻辑错误:你在
groupby中设置了as_index=False,返回的结果是包含分组键+求和值的完整DataFrame,而非单独的求和列,直接将整个DataFrame赋值给某一列时,若目标df2类型异常也会触发报错,同时原代码也没有实现你要求的「仅对Right、Thru、Left对应的value求和」的过滤逻辑。
正确实现代码
场景1:生成单独的汇总表
如果你需要得到按分组聚合后的结果表,直接用以下代码:
# 先过滤目标movement,再分组求和并重命名字段 df2 = df1[df1['movement'].isin(['Right', 'Thru', 'Left'])].groupby( ['id', 'approach', 'start_time'], as_index=False )['value'].sum().rename(columns={'value': 'combinedValue'})
场景2:将汇总值映射回原表每行
如果你需要在原表的每一行都新增对应分组的求和值,用transform方法:
# transform返回和原数据长度一致的聚合结果,直接赋值到新列即可 df1['combinedValue'] = df1[df1['movement'].isin(['Right', 'Thru', 'Left'])].groupby( ['id', 'approach', 'start_time'] )['value'].transform('sum') # 非目标movement的行默认会赋值为NaN,可按需填充为0 df1['combinedValue'] = df1['combinedValue'].fillna(0)
内容的提问来源于stack exchange,提问作者joshuah9
相关产品推荐
相关产品推荐

