删除布尔列 = False 的重复项

Drop the duplicate where boolean column = False

在下面的示例中,我一直在尝试删除 == false 的重复项。我的意思是当 id 和 year 匹配超过 1 行时 (subset =[id, year])

df = pd.DataFrame({'id': ['1', '1', '1', '2', '2', '3', '4', '4'],
                    'Year': [2000, 2000, 2003, 2004, 2004, 2002, 2001, 2003], 'Boolean':['false', 'true', 'true', 'true', 'false', 'true', 'true', 'true']})
print(df)

# Output

  id  Year Boolean
0  1  2000   false
1  1  2000    true
2  1  2003    true
3  2  2004    true
4  2  2004   false
5  3  2002    true
6  4  2001    true
7  4  2003    true
# Attempted code

df2 = df.loc[df['Year'].eq('false').groupby([df.id]).idxmax()]
print(df2)

  id  Year Boolean
0  1  2000   false
3  2  2004    true
5  3  2002    true
6  4  2001    true

此代码不正确,因为我试图在存在重复时保留 Boolean == false 观察结果。它还删除了其他不重复的观察结果。不确定为此使用复制功能是否更容易。

"我一直在尝试删除 == false 的重复项。我的意思是当 id 和年份匹配超过 1 行时 (subset =[id, year])" -> 所以你需要按 ID 和 Year 分组(并使用正确的列作为布尔值源):

df.loc[df['Boolean'].eq('false').groupby([df['id'], df['Year']]).idxmax()]

输出:

  id  Year Boolean
0  1  2000   false
2  1  2003    true
4  2  2004   false
5  3  2002    true
6  4  2001    true
7  4  2003    true

布尔值

请注意,使用真正的布尔值会更好(更快、内存更少、语法更短……)

# convert to booleans
df['Boolean'] = df['Boolean'].eq('true')

df.loc[df.groupby(['id', 'Year'])['Boolean'].idxmin()]

  id  Year  Boolean
0  1  2000    False
2  1  2003     True
4  2  2004    False
5  3  2002     True
6  4  2001     True
7  4  2003     True