代码之家  ›  专栏  ›  技术社区  ›  Tim Kirkwood

比较空数据帧

  •  1
  • Tim Kirkwood  · 技术社区  · 6 月前

    我有一个功能, extract_redundant_values ,从pandas数据帧中提取冗余行。我正在通过运行来测试它 in_df 生成 out_df 。然后,我将其与我的预期输出进行比较 expected_out_df 。它们似乎具有相同的索引、列和值,但根据 pd.DataFrame().equals() :

    import numpy as np
    import pandas as pd
    
    def extract_redundant_values(df, col):
        unique_df = df.drop_duplicates(subset=[col],
                                       keep = False)
        redundant_df = df[~df.index.isin(unique_df.index)]
        return redundant_df
    
    # =============================================================================
    # setup
    # =============================================================================
    expected_columns = ['Col1', 'Col2', 'Col3']
    in_df = pd.DataFrame(data = [[1, 2, 3],
                                [4, 6, 6],
                                [7, 8, 9]], 
                        columns = expected_columns)
    
    # =============================================================================
    # run 
    # =============================================================================
    out_df = extract_redundant_values(df = in_df,
                                      col = "Col1")
    
    # =============================================================================
    # compare
    # =============================================================================
    expected_out_df = pd.DataFrame(columns = expected_columns)
    
    #same values, index and dataframe
    assert out_df.columns.equals(expected_out_df.columns) #fine
    assert out_df.index.equals(expected_out_df.index) #fine
    assert np.array_equal(expected_out_df.values, out_df.values) #fine
    
    #not the same for some other reason...
    assert out_df.equals(expected_out_df) #assertion error
    

    我还尝试比较了两个具有相同列的空数据帧,这些数据帧和预期的一样好,所以我不明白为什么 out_df 预期输出df 被认为是不同的:

    expected_columns = ['Col1', 'Col2', 'Col3']
    eg_df1 = pd.DataFrame(columns = expected_columns)
    eg_df2 = pd.DataFrame(columns = expected_columns)
    assert eg_df1.equals(eg_df2) #fine
    

    有人能解释一下吗?

    谢谢!

    1 回复  |  直到 6 月前
        1
  •  1
  •   JonSG    6 月前

    你的 expected_out_df 数据帧的数据类型为“object”,而您的 out_df 数据类型为 np.int64 这对 .equals() .

    请参阅此讨论: API: how strict should the equals() method be?

    要解决此问题,您可以设置 预期输出df 数据类型。

    expected_out_df = pd.DataFrame(columns=expected_columns, dtype=np.int64)
    

    现在你的断言应该通过了。