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

如何在Pandas数据框中对指定分组删除单列为值其余列为NaN的行?

解决Pandas数据框分组合并非NaN值的问题

看起来你想要的是对每个time+name的分组,保留该组中val1和val2都不为NaN的行(如果存在的话),如果不存在就保留现有非NaN的行。你的循环方法出现重复添加的问题,是因为没有正确区分处理分组和未处理分组,且append的逻辑容易导致重复。下面给你两种更简洁可靠的方法:

方法一:全局分组合并(最简洁)

利用groupby结合max()或first(),这两个方法会自动忽略NaN值,直接提取每组中非NaN的有效值:

import pandas as pd

# 构造你的示例数据
df = pd.DataFrame({
    "time": ["0500"]*7,
    "name": ["unit1", "unit1", "unit1", "unit2", "unit3", "unit3", "unit3"],
    "val1": [1, pd.NA, 1, 1, 1, pd.NA, 1],
    "val2": [pd.NA, 1, 1, pd.NA, pd.NA, 1, 1]
})

# 按time和name分组,取每组的最大值(自动忽略NaN)
result = df.groupby(["time", "name"], as_index=False).max()
print(result)

运行后输出正好是你期望的结果:

time   name  val1  val2
0  0500  unit1     1     1
1  0500  unit2     1   NaN
2  0500  unit3     1     1

方法二:仅处理指定分组(更灵活)

如果你只想对duplicates列表里的分组做合并,其他分组保持原样,可以拆分处理后再合并:

duplicates = ['unit1', 'unit3']

# 处理需要合并的分组:分组后取max
processed_groups = df[df['name'].isin(duplicates)].groupby(["time", "name"], as_index=False).max()

# 保留不需要处理的分组:去重(避免重复行)
unprocessed_groups = df[~df['name'].isin(duplicates)].drop_duplicates(["time", "name"])

# 合并两个部分并排序
result = pd.concat([processed_groups, unprocessed_groups], ignore_index=True)
result = result.sort_values("name").reset_index(drop=True)
print(result)

为什么你的原代码会出问题?

你的循环逻辑里,update_df初始值如果没定义的话会报错,而且每次循环只添加了当前分组dropna()后的行,但没有移除原数据中该分组的其他行,同时未处理的分组(比如unit2)也没有被正确加入,最终导致重复数据出现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 03:02:31