Python实现多字典内多DataFrame指定日期的数值求和
按日期合并多字典中DataFrame并求和
需求描述
我有两个字典,每个字典包含两个不同大小的DataFrame,所有DataFrame都共享Date和# of Apples列。需要创建results_df,包含Date和Sum of Apples列,对所有四个DataFrame中匹配日期的# of Apples数值求和,缺失日期的求和结果填0。
示例数据
import pandas as pd # 构造示例DataFrame df1 = pd.DataFrame({'Date': ['2023-01-01', '2023-01-03'], '# of Apples': [5, 2]}) df2 = pd.DataFrame({'Date': ['2023-01-01', '2023-01-04'], '# of Apples': [1, 4]}) dict1 = {'df1': df1, 'df2': df2} df3 = pd.DataFrame({'Date': ['2023-01-03', '2023-01-04'], '# of Apples': [2, 5]}) df4 = pd.DataFrame({'Date': ['2023-01-01', '2023-01-03'], '# of Apples': [4, 3]}) dict2 = {'df3': df3, 'df4': df4}
期望结果
results_df: Date Sum of Apples 0 2023-01-01 10 1 2023-01-02 0 2 2023-01-03 7 3 2023-01-04 9
高效解决方案
利用Pandas的concat、groupby和reindex特性,无需循环遍历,高效实现需求:
- 收集所有DataFrame:把两个字典里的DataFrame提取到一个列表中
- 合并并分组求和:用
concat合并所有DataFrame,按Date分组求和 - 补全缺失日期:生成完整的日期序列,用
reindex填充缺失日期的求和值为0
# 1. 收集所有DataFrame all_dfs = list(dict1.values()) + list(dict2.values()) # 2. 合并并按日期求和 sum_df = pd.concat(all_dfs).groupby('Date')['# of Apples'].sum().reset_index() sum_df.columns = ['Date', 'Sum of Apples'] # 3. 生成完整日期序列(以示例中的日期范围为例,可根据实际调整) min_date = pd.to_datetime(sum_df['Date']).min() max_date = pd.to_datetime(sum_df['Date']).max() full_dates = pd.date_range(start=min_date, end=max_date).strftime('%Y-%m-%d') # 4. 补全缺失日期,填充0 results_df = sum_df.set_index('Date').reindex(full_dates, fill_value=0).reset_index() results_df.columns = ['Date', 'Sum of Apples'] print(results_df)
代码解释
- 收集DataFrame:
list(dict.values())直接提取字典中的所有DataFrame,拼接成列表,无需逐个访问键名 - 合并分组求和:
concat批量合并所有DataFrame,groupby('Date').sum()自动按日期聚合求和,比循环高效得多 - 补全日期:
date_range生成完整的日期序列,reindex对齐求和结果,缺失日期自动填充0,完美符合需求
如果需要扩展日期范围(比如包含示例中的2023-01-05),只需调整date_range的end参数即可,比如:
full_dates = pd.date_range(start='2023-01-01', end='2023-01-05').strftime('%Y-%m-%d')
内容的提问来源于stack exchange,提问作者M04RC4GR
相关产品推荐
相关产品推荐

