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

如何在循环合并DataFrame时按条件对重复数据求和?

解决方案

核心思路

不用在循环里逐次判断拼接,更高效的方式是先将所有CSV数据与主DataFrame合并,再按building和day分组对kw/h求和。这种方式利用Pandas的向量化操作,比循环内的条件判断更简洁高效。

问题解答

  1. 检查重复的building和day
    可以通过将building和day设为复合索引,或使用duplicated()方法快速识别重复项。不过更实用的是在合并所有数据后统一处理,避免逐次判断的冗余操作。

  2. 对重复行的kw/h求和
    使用groupby()方法按building和day分组,再对kw/h列执行sum()聚合操作,自动完成重复项的数值求和,无需手动遍历判断。

完整实现代码

import pandas as pd

# 初始化示例主DataFrame
main_df = pd.DataFrame({
    'building': [1, 1, 2, 2],
    'day': [1, 2, 1, 2],
    'kw/h': [50, 55, 30, 40]
})

path_list = ['new_df_1.csv', 'new_df_2.csv']  # 替换为你的CSV文件路径列表

# 1. 读取所有CSV文件并合并为一个临时DataFrame
all_new_dfs = []
for csv in path_list:
    df = pd.read_csv(csv)
    all_new_dfs.append(df)
combined_new_df = pd.concat(all_new_dfs, ignore_index=True)

# 2. 合并主DataFrame与所有新数据
merged_df = pd.concat([main_df, combined_new_df], ignore_index=True)

# 3. 按building和day分组,对kw/h列求和
final_df = merged_df.groupby(['building', 'day'], as_index=False)['kw/h'].sum()

print(final_df)

输出结果

building  day  kw/h
0         1    1    50
1         1    2    55
2         2    1    45
3         2    2    59
4         2    3    14
5         3    1    55
6         3    2    58

替代方案(循环内逐次更新)

如果必须保留循环逻辑,可以按以下方式实现:

for csv in path_list:
    new_df = pd.read_csv(csv)
    # 找出新数据中与主DataFrame重复的行(基于building和day)
    duplicated_mask = new_df[['building', 'day']].apply(tuple, axis=1).isin(
        main_df[['building', 'day']].apply(tuple, axis=1)
    )
    # 拆分重复行与非重复行
    duplicated_rows = new_df[duplicated_mask]
    new_rows = new_df[~duplicated_mask]
    
    # 更新重复行的kw/h数值
    for _, row in duplicated_rows.iterrows():
        main_df.loc[
            (main_df['building'] == row['building']) & (main_df['day'] == row['day']),
            'kw/h'
        ] += row['kw/h']
    
    # 拼接非重复行到主DataFrame
    main_df = pd.concat([main_df, new_rows], ignore_index=True)

注意:此方案效率低于批量合并后分组求和,数据量大时不推荐使用。

内容的提问来源于stack exchange,提问作者M.A.Sedigh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:45:40