Pandas DataFrame中按日期列聚合多值的高效替代迭代方法
优化方案分析与实现
原代码问题解析
你当前的代码存在两个核心问题:
- 存储错误原因:循环中使用
df['Title']和df['Description']会取整个列的数据,而非当前行的对应值,导致每次拼接的是整列内容,而非单条记录的Title和Description。正确写法应该是row['Title']和row['Description']。 - 性能低下原因:
iterrows()是逐行迭代,本质是Python层面的循环,对于大DataFrame来说效率极低,Pandas的优势在于向量化操作,应尽量避免逐行遍历。
更优实现方法:使用groupby+向量化聚合
利用Pandas的groupby功能按日期分组,结合字符串聚合操作,完全避免Python循环,性能会提升几个数量级。
实现步骤:
- 先为每行生成拼接后的字符串:
\n{Title}\n{Description} - 按
Date列分组,将每组内的拼接字符串用换行符连接 - 将分组结果转换为字典,即为目标的
news字典
代码示例:
# 生成每行的拼接字符串 df['content'] = '\n' + df['Title'] + '\n' + df['Description'] # 按Date分组并聚合,转成字典 news = df.groupby('Date')['content'].agg('\n'.join).to_dict()
验证结果:
对于你的示例DataFrame,最终news的内容为:
{ '2003-02-10': '\nA\nage\nB\nnumber\nC\ntotal\nD\npercentage', '2003-02-11': '\nE\ndivision', '2003-02-12': '\nF\ncumulative', '2003-02-13': '\nG\nampersand\nH\nvalue' }
额外优化点
如果不需要保留中间的content列,可以用链式调用简化代码:
news = (df.assign(content='\n' + df['Title'] + '\n' + df['Description']) .groupby('Date')['content'] .agg('\n'.join) .to_dict())
内容的提问来源于stack exchange,提问作者Raagib khan
相关产品推荐
相关产品推荐

