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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 09:12:47