优化含字典单元格的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
相关产品推荐
相关产品推荐

