如何为DataFrame添加多列?添加总计字段遇列数异常及KeyError问题
解决DataFrame添加总计字段的两个问题
嘿,我来帮你梳理下这两个问题的根源和修复方法,咱们一步步来:
问题1:第一段代码仅生成1个新列,未达预期
这种情况大概率是你的代码只针对单个列做了总计计算,没有批量处理多个目标列。比如你可能只写了一行df['cat1tot'] = df['cat1'].sum(),自然只会生成cat1tot这一个列,而没处理cat2tot。
快速修复:批量生成总计列
如果你想给cat1、cat2分别生成对应的总计列(每行都显示该列的总和),可以用循环或者assign方法批量处理:
# 方法1:用循环批量生成 source_cols = ['cat1', 'cat2'] total_cols = ['cat1tot', 'cat2tot'] for src_col, total_col in zip(source_cols, total_cols): df[total_col] = df[src_col].sum() # 方法2:用assign更简洁 df = df.assign( cat1tot=df['cat1'].sum(), cat2tot=df['cat2'].sum() )
问题2:第二段代码触发KeyError: "['cat1tot' 'cat2tot'] not in index"
这个报错的核心原因是:你尝试直接给不存在的列cat1tot、cat2tot赋值,而且右侧的计算结果(df[['cat1','cat2']].sum()返回的Series)的索引是原列名cat1、cat2,pandas会尝试把右侧的索引和左侧的目标列名匹配,找不到对应关系就抛出KeyError。
举个例子,如果你写了这样的代码:
# 错误写法,会触发KeyError df[['cat1tot', 'cat2tot']] = df[['cat1', 'cat2']].sum()
右侧的sum()结果是一个索引为cat1、cat2的Series,pandas不知道怎么把cat1对应到cat1tot,所以报错。
正确的批量赋值方式
如果你想用一行代码批量生成总计列,可以先把sum结果转成DataFrame并重命名列,再合并到原DataFrame:
# 先计算总和,重命名列,转成DataFrame totals_df = df[['cat1', 'cat2']].sum().rename({ 'cat1': 'cat1tot', 'cat2': 'cat2tot' }).to_frame().T # 把总计行广播到原DataFrame的每一行,合并列 df = pd.concat([ df, totals_df.loc[totals_df.index.repeat(len(df))].reset_index(drop=True) ], axis=1)
另外,如果你是想添加总计行(在DataFrame末尾显示各列的总和),而不是总计列,那应该这么写:
# 计算数值列的总和,生成总计行 total_row = df.sum(numeric_only=True) total_row.name = 'Total' # 添加到原DataFrame末尾 df = pd.concat([df, total_row.to_frame().T], axis=0)
内容的提问来源于stack exchange,提问作者Brad Rhoads
相关产品推荐
相关产品推荐

