如何在循环合并DataFrame时按条件对重复数据求和?
解决方案
核心思路
不用在循环里逐次判断拼接,更高效的方式是先将所有CSV数据与主DataFrame合并,再按building和day分组对kw/h求和。这种方式利用Pandas的向量化操作,比循环内的条件判断更简洁高效。
问题解答
检查重复的
building和day
可以通过将building和day设为复合索引,或使用duplicated()方法快速识别重复项。不过更实用的是在合并所有数据后统一处理,避免逐次判断的冗余操作。对重复行的
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
相关产品推荐
相关产品推荐

