如何基于DataFrame第二列值筛选第一列并保留对应重复行?
解决方案
方法1:先提取有效设备再筛选
最直接的做法是先找出所有存在非空维护代码的设备,再保留这些设备的所有记录:
# 过滤出有维护代码的设备,去重得到有效设备集合 valid_devices = df[df['Revision'].str.strip() != '']['Functional Loc.'].unique() # 筛选原表中属于有效设备的所有行 df_filtered = df[df['Functional Loc.'].isin(valid_devices)]
方法2:修正你的groupby过滤逻辑
你用groupby.filter的方向没错,但lambda条件写反了逻辑——原代码是逐行判断是否非空,所以只会留下非空行;正确的逻辑是判断整个设备组里有没有至少一行非空维护代码,只需要给条件加个.any():
# 只要设备组内存在非空维护代码,就保留该组所有行 df_filtered = df.groupby('Functional Loc.').filter(lambda x: (x['Revision'].str.strip() != '').any())
原代码问题出在哪?
你写的lambda x: (x['Revision']!='')会返回一个布尔数组,groupby.filter会把数组里为True的行单独保留,相当于直接删掉了所有空行,而不是保留整个设备组。加上.any()后,会检查该设备组是否满足“至少有一行非空”,满足就保留整个组的所有行,包括空行。
结果验证
运行上述代码后,所有维护代码全为空的设备(比如示例里的FE07、JU01等)会被过滤掉,有过维护代码记录的设备(ET01B、ET02A、ET02B)的所有行都会被保留,完全符合你的期望输出。
内容的提问来源于stack exchange,提问作者slabbe
相关产品推荐
相关产品推荐

