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

优化含字典单元格的Pandas DataFrame值累加效率

高效实现多列字典逐行累加的方案

针对你遇到的Pandas DataFrame多列字典逐行累加效率低的问题,这里提供几个比apply+Counter更高效的实现方案:

方法一:批量展开字典后按行聚合(推荐大数据量使用)

这个方案利用Pandas的向量化聚合操作,避免逐行Python循环,性能提升最明显:

import pandas as pd

# 假设原DataFrame为df,包含所有字典列
# 1. 遍历所有列,将字典展开为长格式表并保留行索引
expanded_dfs = []
for col in df.columns:
    temp_df = df[col].apply(pd.Series).stack().reset_index()
    temp_df.columns = ['row_idx', 'key', 'value']
    expanded_dfs.append(temp_df)

# 合并所有展开后的表
combined_df = pd.concat(expanded_dfs, ignore_index=True)

# 2. 按行索引和键分组,求和对应的值
aggregated = combined_df.groupby(['row_idx', 'key'])['value'].sum().unstack()

# 3. 将每行的键值对转回字典,赋值给新列
df['col_result'] = aggregated.apply(lambda x: x.dropna().to_dict(), axis=1)

核心优势:Pandas的分组聚合基于C实现,比纯Python循环快数倍,尤其适合字典键重复度高、DataFrame行数多的场景。

方法二:优化版逐行循环(轻量场景)

如果不想做大规模数据展开,可通过raw=True减少Pandas的数据转换开销,配合生成器扁平化键值对,比原生apply+Counter更快:

from collections import Counter

def sum_row_dicts(row):
    # 用生成器扁平化当前行所有字典的键值对
    all_kv_pairs = (pair for d in row for pair in d.items())
    return dict(Counter(all_kv_pairs))

# raw=True 传入numpy数组而非Series,减少转换开销
df['col_result'] = df.apply(sum_row_dicts, axis=1, raw=True)

方法三:并行计算(超大数据量)

当数据量超出单核心处理能力时,用Dask实现多CPU并行计算:

import dask.dataframe as dd
from collections import Counter

# 转换为Dask DataFrame,分区数根据CPU核心数调整
ddf = dd.from_pandas(df, npartitions=4)

def sum_row_dicts(row):
    all_kv_pairs = (pair for d in row for pair in d.items())
    return dict(Counter(all_kv_pairs))

# 并行处理生成结果列
ddf['col_result'] = ddf.apply(sum_row_dicts, axis=1, meta=object)

# 转回Pandas DataFrame
df = ddf.compute()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:51:21