如何在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
相关产品推荐
相关产品推荐

