如何用单行Pandas代码按ID分组,基于B=1求A列最大值并回填?
单行代码实现分组筛选后回填最大值
需求说明
按ID分组,仅筛选每组中B=1的行,计算A列的最大值(忽略NaN),并将该最大值回填至原DataFrame的所有对应行;仅当某组中B=1对应的A值全为NaN时,该行的结果才为NaN。
正确单行代码
df['desired_output'] = df.assign(A=df['A'].where(df['B'] == 1)).groupby('ID')['A'].transform('max')
代码解释
df.assign(A=df['A'].where(df['B'] == 1)):临时将B≠1的行的A值替换为NaN,保留B=1的行的原始A值,其他列保持不变。groupby('ID')['A'].transform('max'):按ID分组计算A列的最大值(自动忽略NaN),再通过transform将最大值广播到该组的所有行,直接完成原DataFrame的回填。
错误代码分析
第一段报错代码:
df.groupby('ID').A.where(df.B == 1).transform('max')
错误原因:where的条件df.B ==1是基于整个DataFrame的,而非分组后的子DataFrame,导致维度不匹配引发报错。第二段不符合需求的代码:
df.where(df.B == 1).groupby('ID').A.transform('max')
问题所在:df.where(df.B ==1)会将B≠1的整行设为NaN,分组计算最大值后,这些B≠1的行对应的结果也会是NaN,不符合“全组回填最大值”的要求。
内容的提问来源于stack exchange,提问作者Ankhnesmerira
相关产品推荐
相关产品推荐

