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

如何按指定规则合并两个Pandas DataFrame并填充缺失值为0?

问题描述

我需要合并两个DataFrame:

df1:

Server      Model     Slot  Count40G
server1     Cisco     1      10 
server1     Cisco     2      5
server1     Cisco     3      20
server2     IBM       5      10
server2     IBM       8      5

df2:

Server      Model     Slot    Count10G
server1     Cisco     1        5
server1     Cisco     8        10
server1     Cisco     4        1
server2     IBM       5        1
server2     IBM       9        5

期望合并后的DataFrame如下:

Server      Model     Slot  Count40G Count10G
server1     Cisco      1     10       5
server1     Cisco      2     5        0
server1     Cisco      3     20       0
server1     Cisco      4     0        1
server1     Cisco      8     0        10
server2     IBM        5     10       1
server2     IBM        8     5        0
server2     IBM        9     0        5

合并规则:整合同一Server下的所有Slot,对应Slot无Count40G或Count10G值时填充为0。

我尝试了以下代码:

pd.merge(df1, df2, on="Server", how="outer")

但该代码既没有自动填充0,还产生了大量冗余行,请问该如何解决?


解决方案

你之前的问题核心是只基于Server合并,导致同Server下的Slot两两匹配产生笛卡尔积,且未正确对齐每个Slot的维度。正确做法是基于Server+Model+Slot三个字段做外连接,再填充缺失值。

完整实现代码

import pandas as pd

# 构造示例数据
df1 = pd.DataFrame({
    'Server': ['server1', 'server1', 'server1', 'server2', 'server2'],
    'Model': ['Cisco', 'Cisco', 'Cisco', 'IBM', 'IBM'],
    'Slot': [1, 2, 3, 5, 8],
    'Count40G': [10, 5, 20, 10, 5]
})

df2 = pd.DataFrame({
    'Server': ['server1', 'server1', 'server1', 'server2', 'server2'],
    'Model': ['Cisco', 'Cisco', 'Cisco', 'IBM', 'IBM'],
    'Slot': [1, 8, 4, 5, 9],
    'Count10G': [5, 10, 1, 1, 5]
})

# 1. 基于三个字段做外连接,对齐所有Server-Model-Slot组合
merged_df = pd.merge(df1, df2, on=['Server', 'Model', 'Slot'], how='outer')

# 2. 将缺失的计数填充为0
merged_df[['Count40G', 'Count10G']] = merged_df[['Count40G', 'Count10G']].fillna(0)

# 3. 可选:按Server和Slot排序,匹配期望格式
merged_df = merged_df.sort_values(by=['Server', 'Slot']).reset_index(drop=True)

# 可选:将浮点型转为整型
merged_df[['Count40G', 'Count10G']] = merged_df[['Count40G', 'Count10G']].astype(int)

print(merged_df)

输出结果

Server  Model  Slot  Count40G  Count10G
0  server1  Cisco     1        10         5
1  server1  Cisco     2         5         0
2  server1  Cisco     3        20         0
3  server1  Cisco     4         0         1
4  server1  Cisco     8         0        10
5  server2    IBM     5        10         1
6  server2    IBM     8         5         0
7  server2    IBM     9         0         5

内容的提问来源于stack exchange,提问作者user1471980

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:52:41