Pandas中使用groupby+transform结合多列条件lambda时的异常行为疑问
Pandas中使用groupby+transform结合多列条件lambda时的异常行为疑问
嘿各位Pandas达人,我最近碰到了一个挺费解的问题,想过来请教下!
我的需求是这样的:针对数据里的每个分组,检查指定列的缺失值占比,如果占比超过我设定的60%阈值,就把该列在这个分组下的所有值都替换成NA;要是没超过阈值,就保留原有的值(包括原本就存在的NA)。
为了实现这个逻辑,我尝试用groupby搭配transform,再结合一个带条件判断的lambda函数——核心逻辑就是先计算分组内该列的缺失值占比,根据占比和阈值的对比结果,决定返回原数据还是全NA。大部分情况这个逻辑都正常,但在某些特定条件下会出现奇怪的结果。
下面是我写的可复现代码:
import pandas as pd import numpy as np df = pd.DataFrame( { "A" : [np.nan, 4.7, 6.6, np.nan, np.nan, 5.4, 6., 5.3], "B" : [np.nan, np.nan, 7.2, 15., np.nan, 5.5, np.nan, np.nan], "C" : ["D", "D", "D", "E", "E", "F", "F", "F"] } ) # 我尝试的实现代码 result = df.groupby("C").transform(lambda x: x if x.isna().mean() <= 0.6 else np.nan) print(result)
我原本以为这个代码能按预期工作,但实际运行后,部分分组的处理结果和我预想的完全不一样。比如分组D里,列A的缺失率是1/3≈33%(低于60%),应该保留原数据;列B的缺失率是2/3≈66.7%(高于60%),应该把分组D的列B全部换成NA。可实际输出的结果却不符合这个预期,我实在搞不懂哪里出了问题。
有没有大佬能帮我分析下这到底是怎么回事?是我的lambda函数写法有问题,还是groupby.transform的某些特性我没理解透?
备注:内容来源于stack exchange,提问作者TimDdckr




