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

如何在pandas DataFrame新增多列时合并多列表数据并计算日总条目数

问题解决方案

1. 修正初始DataFrame创建的语法问题

你最初写的创建DataFrame的代码存在参数传参错误,columns参数需要接收一个包含所有列名的列表,否则会触发参数解析报错,正确初始化代码如下:

import pandas as pd
import numpy as np

# 定义完整列名
all_cols = [
    'date','itemA','itemB','itemC','itemD','itemE','itemF','itemG','itemH','itemI','itemJ',
    'itemK','itemL','itemM','itemN','itemO','itemP','itemQ','itemR','itemS','itemT','itemU','total'
]
item_cols = all_cols[1:-1]  # 提取itemA到itemU的所有物品列
df = pd.DataFrame(columns=all_cols)

2. 合并同日期的多行数据

你逐行追加数据后,同日期不同物品的记录会分散在不同行,其余物品列默认填充NaN,直接按date字段分组聚合即可完成合并:

  • 分组维度为date
  • 对所有物品列执行求和聚合:同日期下同物品的多条记录会自动累加,仅存在单条记录的物品列会保留原有数值,无记录的物品列会自动填充为0,完全匹配业务统计逻辑
    对应代码:
# 分组合并同日期数据,as_index=False保证date保留为普通列
df_merged = df.groupby('date', as_index=False)[item_cols].sum(numeric_only=True)

如果需要保留数据中日期的原始排序,可以在分组前先把date列转成pd.Categorical类型指定顺序,或者分组后按原始日期出现顺序重排。

更高效的前置处理方案(推荐)

逐行追加DataFrame再合并的方式运行效率很低,数据量大的时候性能很差,更推荐先把所有原始记录存为(日期, 物品类型, 数量)的长表结构,再直接透传成目标宽表,从根源避免同日期多行问题:

# 示例:raw_data存放所有原始统计记录,单条格式为(日期, 物品类型, 数量)
raw_data = [
    ('2020-01-01', 'itemA', 20),
    ('2020-01-01', 'itemC', 40),
    ('2020-01-01', 'itemM', 5),
    ('2020-01-02', 'itemB', 15)
]
# 构建长表
df_long = pd.DataFrame(raw_data, columns=['date', 'item_type', 'count'])
# 透视成目标宽表结构,缺失值填0
df_merged = df_long.pivot(
    index='date',
    columns='item_type',
    values='count'
).fillna(0).reset_index()
# 补全所有物品列,避免某类物品全量无数据时列缺失
df_merged = df_merged.reindex(columns=['date'] + item_cols).fillna(0)

3. 生成total当日总数量列

合并得到单日期单行的数据集后,直接对每行的所有物品列做横向求和即可得到当日总数量:

# axis=1指定为横向行维度求和
df_merged['total'] = df_merged[item_cols].sum(axis=1)

如果需要把total列放到最后一列(和你最开始定义的列顺序一致),可以最后做一次列重排:

df_final = df_merged[all_cols]

内容的提问来源于stack exchange,提问作者mperrotta913

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 23:57:35