如何过滤col3空值后按col1分组筛选Pandas DataFrame的col2最大值行
解决Pandas筛选分组最大值行的问题
错误原因
你的代码报错是因为&两边的操作数类型不匹配:df[['col3']].notnull().all(1)是布尔数组,而df.sort_values('col2').drop_duplicates(['col1'], keep='last')是完整的DataFrame,布尔数组和DataFrame不能直接用&运算。
正确实现方法
方法1:利用transform匹配分组最大值
先过滤掉col3为空的行,再通过groupby.transform获取每组col2的最大值,最后用布尔索引筛选出对应行:
# 过滤col3非空行 filtered_df = df[df['col3'].notna()] # 获取每组col2的最大值,生成与原表长度一致的数组 group_max = filtered_df.groupby('col1')['col2'].transform('max') # 筛选出col2等于组内最大值的行 result = filtered_df[filtered_df['col2'] == group_max]
方法2:排序后分组取首尾行
同样先过滤col3非空行,然后按col2排序,再按col1分组取每组最后一行(升序排序时最后一行是最大值):
filtered_df = df[df['col3'].notna()] # 按col2升序排序,分组取每组最后一行 result = filtered_df.sort_values('col2').groupby('col1').tail(1) # 或者按col2降序排序,分组取每组第一行,结果相同 result = filtered_df.sort_values('col2', ascending=False).groupby('col1').head(1)
两种方法都能得到你预期的输出:
col1 col2 col3 x 12 abc y 10 abc
内容的提问来源于stack exchange,提问作者rshar
相关产品推荐
相关产品推荐

