如何按指定规则合并两个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
相关产品推荐
相关产品推荐

