pandas如何删除IndentNo分组下PO_Ref_No全不为空的所有对应行
问题原因
你原有代码的逻辑是直接删除所有PO_Ref_No为空的行,和「保留存在空PO_Ref_No的整个IndentNo分组、删除所有PO_Ref_No都不为空的IndentNo全部分组」的需求不符,所以会误删10023分组的空行,也无法实现删除整个10024分组的效果。
实现方案
方法1:groupby + transform (性能最优,适合大数据量)
无需新增中间列,一行代码即可完成过滤:
# 空值为np.nan时用这个 df = df[df['PO_Ref_No'].isna().groupby(df['IndentNo']).transform('any')] # 如果你的空值是空字符串,替换成这个 # df = df[df['PO_Ref_No'].eq('').groupby(df['IndentNo']).transform('any')]
逻辑说明:
- 先判断每行
PO_Ref_No是否为空,得到布尔序列 - 按
IndentNo分组后对布尔序列执行any运算,只要分组内有一个空值,该分组所有行对应的判断结果都为True - 用得到的布尔序列过滤原DataFrame,就能保留所有符合要求的行
方法2:groupby + filter (可读性更高)
逻辑更直观,中小数据量下使用足够方便:
df = df.groupby('IndentNo').filter(lambda group: group['PO_Ref_No'].isna().any())
内容的提问来源于stack exchange,提问作者pythondumb
相关产品推荐
相关产品推荐

