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

如何合并Pandas DataFrame同hostname行并保留首非NaN值?

解决Pandas合并相同hostname行并保留首有效值的问题

这是个很常见的DataFrame数据清洗需求,我来给你一步步讲清楚怎么实现:

核心思路

我们需要按hostname分组,对每个组的每一列提取第一个非NaN值,最后清理掉那些除hostname外其他列全为NaN的行(也就是原数据中该hostname对应的所有行都没有有效值的情况)。

代码示例与解释

1. 先构造一个模拟数据(方便你对照理解)

import pandas as pd
import numpy as np

# 模拟你的数据结构:相同hostname有多行,各列零散分布NaN值
df = pd.DataFrame({
    'hostname': ['server1', 'server1', 'server2', 'server3', 'server3'],
    'cpu': [np.nan, 4, 8, np.nan, np.nan],
    'memory': [16, np.nan, np.nan, 32, np.nan],
    'disk': [np.nan, 512, 1024, np.nan, np.nan]
})

2. 分组并提取首有效值

用groupby结合first()方法就能快速搞定,这个方法会自动跳过NaN,取每组每列的第一个有效值:

# 按hostname分组,as_index=False让hostname保持为普通列(而非索引)
merged_df = df.groupby('hostname', as_index=False).first()

⚠️ 注意:first()是按照原数据的行顺序来取第一个有效值的,如果你的数据需要按特定逻辑(比如时间先后)优先取更早的有效值,记得先排序:

# 假设你有time列,先按hostname和时间戳排序
df_sorted = df.sort_values(['hostname', 'time'])
merged_df = df_sorted.groupby('hostname', as_index=False).first()

3. 删除无效行(全NaN的行)

分组后可能会出现某些hostname对应的所有业务列(除了hostname)都是NaN的情况,这时候我们需要删掉这些无意义的行:

# 删除除hostname外所有列都是NaN的行
merged_df = merged_df.dropna(subset=merged_df.columns.drop('hostname'), how='all')

4. 可选:清理全NaN的列

如果你的DataFrame里有整列都是NaN的冗余列,也可以一并清理掉:

merged_df = merged_df.dropna(axis=1, how='all')

最终效果

运行完上面的代码后,示例数据的输出结果会是:

hostnamecpumemorydisk
server14.016.0512.0
server28.0NaN1024.0
server3NaN32.0NaN

如果server3的所有业务列都是NaN,就会被dropna语句直接删除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:41:48