基于server与row列合并DataFrame并填充空值的实操方案
无空值DataFrame合并解决方案
针对你的需求,直接用outer merge会因数据集不匹配产生空值,我们可以通过筛选目标行-合并数据集-按规则填充空值-排序的流程实现,具体步骤如下:
1. 筛选df2中需要保留的行
只提取df2里grid为available的行,这些行需要保留server、row、slot信息,后续填充其他列:
df2_available = df2[df2['grid'] == 'available'].copy()
2. 合并df1和预处理后的df2数据
用pd.concat把df1和筛选后的df2行合并,避免outer merge带来的冗余空值:
combined_df = pd.concat([df1, df2_available], ignore_index=True)
3. 按规则填充空值
提取每个server在df1中的最后一行数据,用这些值填充对应server下的空列:
# 提取每个server在df1的最后一行数据,重置索引以便合并 server_last_rows = df1.groupby('server').last().reset_index() # 合并后填充空值 combined_df = combined_df.merge(server_last_rows, on='server', suffixes=('', '_last'), how='left') for col in df1.columns: if col != 'server': combined_df[col] = combined_df[col].fillna(combined_df[f'{col}_last']) # 删除临时生成的辅助列 combined_df = combined_df.drop([col for col in combined_df.columns if '_last' in col], axis=1)
4. 排序并生成最终结果
按server升序、slot升序排序,得到符合要求的final_df:
final_df = combined_df.sort_values(by=['server', 'slot'], ascending=[True, True]).reset_index(drop=True)
完整示例(含测试数据)
import pandas as pd # 测试用df1 df1 = pd.DataFrame({ 'server': ['s1', 's1', 's2'], 'row': ['r1', 'r2', 'r1'], 'slot': [1, 2, 1], 'cpu': [80, 75, 90], 'mem': [60, 55, 70] }) # 测试用df2 df2 = pd.DataFrame({ 'server': ['s1', 's2', 's3'], 'row': ['r3', 'r2', 'r1'], 'slot': [3, 2, 1], 'grid': ['available', 'used', 'available'] }) # 执行上述流程 df2_available = df2[df2['grid'] == 'available'].copy() combined_df = pd.concat([df1, df2_available], ignore_index=True) server_last_rows = df1.groupby('server').last().reset_index() combined_df = combined_df.merge(server_last_rows, on='server', suffixes=('', '_last'), how='left') for col in df1.columns: if col != 'server': combined_df[col] = combined_df[col].fillna(combined_df[f'{col}_last']) combined_df = combined_df.drop([col for col in combined_df.columns if '_last' in col], axis=1) final_df = combined_df.sort_values(by=['server', 'slot'], ascending=[True, True]).reset_index(drop=True) print(final_df)
核心逻辑说明
- 先筛选df2的目标行,避免引入无关数据导致的空值
- 用server的最后一行数据填充,严格符合“沿用对应server最后一行数值”的要求
- 排序时明确指定
slot升序,保证顺序为1、2、3...
内容的提问来源于stack exchange,提问作者user1471980
相关产品推荐
相关产品推荐

