如何在pandas中基于指定行数据创建小计记录
问题原因
你当前代码输出异常的核心原因是:df.loc[df['animal']=='falcon','num_specimen_seen']返回的是Series对象而非单个数值,多个Series按索引相加时会因为索引不匹配生成NaN值,最终写入单元格的就是整个异常序列而非求和结果。
解决方案
不需要额外创建DataFrame子集,直接用isin()筛选目标动物后调用sum()即可得到求和标量,同时推荐使用pd.concat()替代已在pandas 2.0+版本中被弃用的append()方法,兼容后续版本运行:
import pandas as pd df = pd.DataFrame({'animal': ['falcon', 'dog', 'spider', 'fish'], 'num_specimen_seen': [10, 2, 1, 8]}) # 直接筛选陆生动物求和,仅生成标量结果不创建子集 land_total = df.loc[df['animal'].isin(['falcon', 'dog', 'spider']), 'num_specimen_seen'].sum() # 新增汇总行 df = pd.concat([ df, pd.DataFrame([{'animal': 'Total Land', 'num_specimen_seen': land_total}]) ], ignore_index=True) print(df)
如果需要多次执行同类汇总操作,可以封装成工具函数复用:
def add_animal_total(df, total_name, target_animals): total_val = df.loc[df['animal'].isin(target_animals), 'num_specimen_seen'].sum() return pd.concat([ df, pd.DataFrame([{'animal': total_name, 'num_specimen_seen': total_val}]) ], ignore_index=True) # 多次调用示例 df = add_animal_total(df, 'Total Land', ['falcon', 'dog', 'spider']) df = add_animal_total(df, 'Total Aquatic', ['fish'])
运行后即可得到你需要的预期输出,Total Land对应的num_specimen_seen值为13。
内容的提问来源于stack exchange,提问作者bzflag
相关产品推荐
相关产品推荐

