以下是数据框
import pandas as pd
df = pd.DataFrame({'A' : [1, 1, 2, 2, 3, 4, 5],
'B' : [11, 11, 12, 12, 13,14,15],
'C' :[0.12232, 0.12232, 0.3455, 0.3455, 0.112, 0.567, 0.8901],
'D' :[False, True, True, True, True, True, True],
'E' :[True, True, False, True, True, True, True],
'F' :[False, True, False, True, True, True, True]})
A B C D E F
0 1 11 0.12232 False True False
1 1 11 0.12232 True True True
2 2 12 0.34550 True False False
3 2 12 0.34550 True True True
4 3 13 0.11200 True True True
5 4 14 0.56700 True True True
6 5 15 0.89010 True True True
将drop_duplicates与数据框的子集列列表一起使用对我不起作用。请让我知道,如何以简单快速的方式完成此操作
如果列A,B,C的值重复。请检查D,E,F是否为True,将其从数据框中删除。
预期的输出数据框:
A B C D E F
0 1 11 0.12232 False True False
2 2 12 0.34550 True False False
4 3 13 0.11200 True True True
5 4 14 0.56700 True True True
6 5 15 0.89010 True True True
答案 0 :(得分:1)
我们可以使用DataFrame.duplicated
来检查 A,B and C
+ DataFrame.all
来检查 D,E and F
。这里使用Series.mul
在两个布尔系列之间执行AND
操作
使代码更简洁:
m =( df.duplicated(subset = ['A','B','C'],keep = False)
.mul(df[['D','E','F']].all(axis=1)) )
df.loc[~m]
输出
A B C D E F
0 1 11 0.12232 False True False
2 2 12 0.34550 True False False
4 3 13 0.11200 True True True
5 4 14 0.56700 True True True
6 5 15 0.89010 True True True
答案 1 :(得分:0)
这是我的方式:
t = (df['D'] == True) & (df['E'] == True) & (df['F'] == True) # check where D, E, F are True
e = df.duplicated(subset=['A','B', 'C']) # Check duplicates in A, B, C
a = (e == True) & (e == True) # Check where duplicates are true in D, E, F
a = a.index[a].tolist() # get the index
df = df.drop(index=a) # drop duplicates True in D, E, F
print(df)
# A B C D E F
# 0 1 11 0.12232 False True False
# 2 2 12 0.34550 True False False
# 4 3 13 0.11200 True True True
# 5 4 14 0.56700 True True True
# 6 5 15 0.89010 True True True
答案 2 :(得分:0)
考虑通过以下方式使用帮助器列进行逻辑子集
df = df.assign(grp_count = lamba x: x.groupby(['A','B','C']).transform('count'),
sum_bool = lamba x: x.reindex['D','E','F'].sum(axis=1))
sub_df = (df[(df['grp_count'] > 1 & df['sum_bool'] != 3) | (df['grp_count'] == 1)]
.drop(columns=['grp_count', 'sum_bool']))