在Pandas中实现多键跨两个DataFrame的SUMIF等效功能
Pandas实现类似Excel SUMIF的跨DataFrame高效求和方法
针对你的需求,最优方案是通过数据重塑+分组求和+匹配合并的流程实现,相比拆分多个DataFrame再合并的方式,代码更简洁、效率更高,尤其适合处理大量重复键的场景。
核心步骤
- 将原DataFrame(
df)中的多组KEY_*与KEY_COUNT_*配对,重塑为统一的长格式 - 按
KEY分组求和,得到每个键的总计数 - 与目标DataFrame(
df1)合并,保留所有键,未匹配到的计数填0
完整代码实现
import pandas as pd # 原始数据 df = pd.DataFrame({ 'KEY_1': ['MF1020','MF1020','MF1540','MF5520','MF1525','MF6010'], 'KEY_2': ['MF0520','MF2020','MF2030','MF4520','MF1050','MF1020'], 'KEY_3': ['MF1020','MF2520','MF1020','MF2520','MF1020','MF1060'], 'KEY_COUNT1': [1,0.4,0,0,0.45,0.01], 'KEY_COUNT2': [0,0.3,0.9,0,0.05,0.01], 'KEY_COUNT3': [0,0.3,0.1,1,0.5,0.98], }) df1 = pd.DataFrame({ 'KEY': ['MF1020', 'MF0565', 'MF1540', 'MF5520', 'MF1525', 'MF6515', 'MF6010', 'MF0520','MF2020', 'MF2030', 'MF4520', 'MF1050', 'MF2520', 'MF1060'], 'KEY_COUNT': [0,0,0,0,0,0,0,0,0,0,0,0,0,0] }) # 1. 定义KEY与COUNT的列映射关系 key_count_pairs = [ ('KEY_1', 'KEY_COUNT1'), ('KEY_2', 'KEY_COUNT2'), ('KEY_3', 'KEY_COUNT3') ] # 2. 重塑为长格式:合并所有KEY-COUNT组 melted_data = pd.concat([ df[[key_col, count_col]].rename(columns={key_col: 'KEY', count_col: 'KEY_COUNT'}) for key_col, count_col in key_count_pairs ], ignore_index=True) # 3. 按KEY分组求和 summed_keys = melted_data.groupby('KEY')['KEY_COUNT'].sum().reset_index() # 4. 与df1合并,保留所有KEY,缺失值填0 df_final = df1.set_index('KEY') \ .join(summed_keys.set_index('KEY'), how='left') \ .fillna(0) \ .reset_index() \ .rename(columns={'KEY': 'KEY_1'}) # 输出结果 print(df_final)
结果验证
运行后得到的df_final与你预期的结果完全一致:
KEY_1 KEY_COUNT 0 MF1020 2.01 1 MF0565 0.00 2 MF1540 0.00 3 MF5520 0.00 4 MF1525 0.45 5 MF6515 0.00 6 MF6010 0.01 7 MF0520 0.00 8 MF2020 0.30 9 MF2030 0.90 10 MF4520 0.00 11 MF1050 0.05 12 MF2520 1.30 13 MF1060 0.98
方案优势
- 可扩展性强:新增
KEY_*与KEY_COUNT_*组时,只需在key_count_pairs中添加对应关系即可 - 效率更高:避免多次拆分、合并DataFrame的冗余操作,适合处理大规模数据集
- 逻辑清晰:通过一次重塑完成多组数据的统一处理,代码可读性更强
内容的提问来源于stack exchange,提问作者Nick_FN
相关产品推荐
相关产品推荐

