pandas 覆盖默认True == 1,False == 0行为

wlwcrazw  于 2023-08-01  发布在  其他
关注(0)|答案(2)|浏览(153)

我的 Dataframe 可以包含布尔值和整数的混合,我希望能够执行df_1 == df_2.loc[0,0]这样的操作,并保证如果df_2.loc[0,0]为1,它不会匹配df_1中的True值。

pbgvytdp

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==1False==0相等。在这种情况下,使用applymapbroadcast the above comparison to every cell

# 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))

nimxete2

nimxete22#

关于BoolProofCompare函数,请参阅@OCa的答案。另一个实现也使得0(int)不同于0.0(float):

def BoolProofCompare(a, b):
    return a == b and type(a) == type(b)

字符串
return a == b不起作用的原因是在Python中True == 1True == 1.0

相关问题