我的 Dataframe 可以包含布尔值和整数的混合,我希望能够执行df_1 == df_2.loc[0,0]这样的操作,并保证如果df_2.loc[0,0]为1,它不会匹配df_1中的True值。
df_1 == df_2.loc[0,0]
df_2.loc[0,0]
df_1
True
pbgvytdp1#
预处理数据以避免不同数据类型之间的冲突是更好的做法。但是假设你不能在数据框架中将整数和布尔值分开,那么就用布尔值检测来增强==:
==
def BoolProofCompare(a, b): '''Override default True == 1, False == 0 behavior''' return a==b and isinstance(a, bool)==isinstance(b, bool) BoolProofCompare(1, True) # False BoolProofCompare(0, False) # False BoolProofCompare(1, 1) # True BoolProofCompare(False, False) # True # and so on and so forth
字符串现在,我想您请求的是逐个单元格比较单个值,例如:df_2[0][0],每个元素都在数据框架中,例如df_1,禁用True==1和False==0相等。在这种情况下,使用applymap到broadcast the above comparison to every cell:
df_2[0][0]
True==1
False==0
# my example of input dataframe df col1 col2 0 True 1 1 1 2 2 False 3 3 0 4 df.applymap(lambda x : BoolProofCompare(x, True)) col1 col2 0 True False 1 False False 2 False False 3 False False df.applymap(lambda x : BoolProofCompare(x, False)) col1 col2 0 False False 1 False False 2 True False 3 False False df.applymap(lambda x : BoolProofCompare(x, 1)) col1 col2 0 False True 1 True False 2 False False 3 False False df.applymap(lambda x : BoolProofCompare(x, 0)) col1 col2 0 False False 1 False False 2 False False 3 True False
型我认为将增强的比较封装在一个新函数中会更方便,如下所示:
def BoolProofCompare_df(df, a): ''' Compare single value *a* with dataframe *df*, cell by cell, with True==1 and False==0 equalities disabled. ''' return df.applymap(lambda x : BoolProofCompare(x, a))
型
nimxete22#
关于BoolProofCompare函数,请参阅@OCa的答案。另一个实现也使得0(int)不同于0.0(float):
BoolProofCompare
0
0.0
def BoolProofCompare(a, b): return a == b and type(a) == type(b)
字符串return a == b不起作用的原因是在Python中True == 1和True == 1.0。
return a == b
True == 1
True == 1.0
2条答案
按热度按时间pbgvytdp1#
预处理数据以避免不同数据类型之间的冲突是更好的做法。但是假设你不能在数据框架中将整数和布尔值分开,那么就用布尔值检测来增强
==
:字符串
现在,我想您请求的是逐个单元格比较单个值,例如:
df_2[0][0]
,每个元素都在数据框架中,例如df_1
,禁用True==1
和False==0
相等。在这种情况下,使用applymap到broadcast the above comparison to every cell:型
我认为将增强的比较封装在一个新函数中会更方便,如下所示:
型
nimxete22#
关于
BoolProofCompare
函数,请参阅@OCa的答案。另一个实现也使得0
(int)不同于0.0
(float):字符串
return a == b
不起作用的原因是在Python中True == 1
和True == 1.0
。