如何在Pandas DataFrame中删除B列为'true'时A列重复的行?
解决方法:删除列A重复且列B为'true'的行
首先来说说你原来的代码为什么不生效:
df.loc[df['B']=='true']返回的是原DataFrame的一个子集(大概率是副本而非视图),对这个子集调用drop_duplicates(inplace=True)只会修改这个临时的子集,不会影响你原始的df。- 更关键的是,这段代码的逻辑和你的需求不匹配:你要删除所有满足“A重复且B='true'”的行,但原代码只是在B='true'的行里对A去重、保留第一行,这意味着那些A重复的B='true'行里,第一行会被保留下来,这不符合你的目标。
正确的实现方式
我们可以通过布尔索引直接筛选出需要保留的行:保留的行要么是A不重复,要么是A重复但B不等于'true'。
# 筛选并重新赋值给原DataFrame df = df[~((df.duplicated('A', keep=False)) & (df['B'] == 'true'))]
如果你习惯用drop方法,也可以先获取需要删除的行的索引,再删除:
# 找出所有满足条件的行的索引 to_drop_indices = df[(df.duplicated('A', keep=False)) & (df['B'] == 'true')].index # 从原DataFrame中删除这些行 df.drop(to_drop_indices, inplace=True)
代码解释
df.duplicated('A', keep=False):标记所有A列值重复的行(返回布尔数组,True表示该行的A值在DataFrame中出现过不止一次)。(df.duplicated('A', keep=False)) & (df['B'] == 'true'):找出同时满足“A重复”和“B='true'”的行,这些就是我们要删除的行。~符号:对布尔数组取反,得到需要保留的行的条件。
这样就能精准删除所有符合你要求的行啦!
内容的提问来源于stack exchange,提问作者Tatsuya
相关产品推荐
相关产品推荐

