这是一个替代方案:
df[~((df[['A', 'B']].duplicated(keep=False)) & (df.isnull().any(axis=1)))]# A B Col_1 Col_2# 0 1 a NaN 2# 1 2 b A 2# 2 3 c A 3# 4 4 d B 3# 6 5 e B 4# 7 6 f NaN 4# 8 7 g NaN 5
这使用按位“非”运算符
~来消除满足作为重复行的联合条件的行(该参数
keep=False使该方法对所有非唯一行的结果都为True),并且至少包含一个null值。因此表达式
df[['A','B']].duplicated(keep=False)返回此Series的位置:
# 0 False# 1 False# 2 True# 3 True# 4 True# 5 True# 6 False# 7 False# 8 False
…表达式
df.isnull().any(axis=1)返回该Series:
# 0 True# 1 False# 2 False# 3 True# 4 False# 5 True# 6 False# 7 True# 8 True
…我们将两者都包装在括号中(在索引 *** 作中使用多个表达式时,Pandas语法都需要),然后 再次 将其包装在括号中 ,
以便我们可以否定整个表达式(即
~( ... )),如下所示:
~((df[['A','B']].duplicated(keep=False)) & (df.isnull().any(axis=1))) & (df['Col_2'] != 5)# 0 True# 1 True# 2 True# 3 False# 4 True# 5 False# 6 True# 7 True# 8 False
您可以通过进一步使用逻辑运算符
&和
|(或“或”运算符)来建立更复杂的条件。与SQL一样,根据需要用附加括号将条件分组。例如,使用基于逻辑“
条件X 和 条件Y 都为真,或 条件Z 为真”的过滤器
df[ ( (X) & (Y) ) | (Z) ]。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)