代码之家  ›  专栏  ›  技术社区  ›  python3 programmer

将strip()映射到pandas数据帧中的字符串不会更改NaN条目,但仍然声称它们不同?

  •  1
  • python3 programmer  · 技术社区  · 2 年前

    我有一个数据帧,其中有非常不同类型的条目(文本、整数、浮点、时间等),我正试图从文本条目中删除前导和尾随空格,以便我的其他代码能够按预期工作。但是,我的代码似乎不起作用。

    以下是我尝试做的一个简单示例:

    import pandas as pd
    import numpy as np
    
    df1 = pd.DataFrame(np.array(([np.nan, 2, 3], [4, 5, 6])), columns=["one", "two", "three"])
    print(df1)
    print("")
    df2 = df1.map(lambda x: x.strip() if isinstance(x, str) else x)
    print(df2)
    print("")
    print(df1==df2)
    print("")
    cell1 = df1.at[0, "one"]
    cell2 = df2.at[0, "one"]
    print(cell1, type(cell1))
    print(cell2, type(cell2))
    print(cell1==cell2)
    

    当我运行此代码时,输出为:

       one  two  three
    0  NaN  2.0    3.0
    1  4.0  5.0    6.0
    
       one  two  three
    0  NaN  2.0    3.0
    1  4.0  5.0    6.0
    
         one   two  three
    0  False  True   True
    1   True  True   True
    
    nan <class 'numpy.float64'>
    nan <class 'numpy.float64'>
    False
    

    正如你所看到的, df1 df2 具有完全相同的整数(NaN),但代码块 print(cell1==cell2) 声称这些细胞是不同的。

    这里发生了什么事?

    1 回复  |  直到 2 年前
        1
  •  0
  •   Andrej Kesely    2 年前

    浮子就是这样工作的,你不能直接比较 NaN s( Why is NaN not equal to NaN? )

    使用 Dataframe.equals 以比较数据帧:

    df1 = pd.DataFrame(
        np.array(([np.nan, 2, 3], [4, 5, 6])), columns=["one", "two", "three"]
    )
    
    df2 = df1.map(lambda x: x.strip() if isinstance(x, str) else x)
    
    print(df1.equals(df2))
    

    打印:

    True