如何在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
相关产品推荐
相关产品推荐

