def df_equal(df1, df2):
    """
    Compares two dataframe and tells if they are equal.

    @param          df1     first dataframe
    @param          df2     second dataframe
    @return                 boolean

    The function compare column one by one.
    It does not check the order of the columns is the same.
    It reorders the columns before doing the comparison.

    If you need more complex comparison,
    you can look into function :epkg:`assert_frame_equal`_.

    The function does not handle well NaN values because ``numpy.nan != numpy.nan`` is true.
    It also compares types:

    .. faqref::
        :tag: pandas
        :title: Comment comparer deux dataframe?

        Ecrire ``df1 == df2`` ne compare pas deux dataframes entre deux
        car le sens n'est pas forcément le même pour tout le monde.
        Même si les valeurs sont les mêmes, est-ce l'ordre des colonnes
        est important ?
        Il faut le faire soi-même pour une comparaison spécifique à
        vos besoins. Le code ci-dessus
        compare d'abord les dimensions, ensuite compare l'ordre
        des colonnes puis enfin les valeurs ::

            if df1.shape != df2.shape:
                return False
            l1 = list(df1.columns)
            l2 = list(df2.columns)
            l1.sort()
            l2.sort()
            if l1 != l2:
                return False
            df1 = df1[l1]
            df2 = df2[l2]
            t = (df1 == df2).all()
            s = set(t)
            return False not in s

        Autres alternatives :

        * `equals <http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.equals.html>`_
        * :epkg:`assert_frame_equal`
    """
    if df1.shape != df2.shape:
        return False
    l1 = list(df1.columns)
    l2 = list(df2.columns)
    l1.sort()
    l2.sort()
    if l1 != l2:
        return False
    df1 = df1[l1]
    df2 = df2[l2]
    s = set(df1.dtypes == df2.dtypes)
    if False in s:
        return False
    s = set((df1 == df2).all())
    return False not in s
