簡體   English   中英

如何比較兩個忽略列名的數據框?

[英]How to compare two dataframes ignoring column names?

假設我想比較兩個數據框的內容,而不是列名(或索引名)。 是否可以在不重命名列的情況下實現這一目標?

例如:

df = pd.DataFrame({'A': [1,2], 'B':[3,4]})
df_equal = pd.DataFrame({'a': [1,2], 'b':[3,4]})
df_diff = pd.DataFrame({'A': [1,2], 'B':[3,5]})

在這種情況下, dfdf_equal但不同於df_diff ,因為在值df_equal具有相同的內容,但在那些df_diff 注意df_equal中的列名是不同的,但我還是想得到一個真值。

我嘗試了以下方法:

等於:

# Returns false because of the column names
df.equals(df_equal)

等式:

# doesn't work as it compares four columns (A,B,a,b) assuming nulls for the one that doesn't exist
df.eq(df_equal).all().all()

pandas.testing.assert_frame_equal:

# same as equals
pd.testing.assert_frame_equal(df, df_equal, check_names=False)

我認為可以使用assert_frame_equal ,但似乎沒有一個參數可以忽略列名。

pd.DataFrame圍繞pd.Series ,因此您不太可能在沒有列名的情況下執行比較。

但最有效的方法是下拉到numpy

assert_equal = (df.values == df_equal.values).all()

要處理np.nan ,您可以np.testing.assert_equal 建議使用np.testing.assert_equal並捕獲AssertionError

import numpy as np

def nan_equal(a,b):
    try:
        np.testing.assert_equal(a,b)
    except AssertionError:
        return False
    return True

assert_equal = nan_equal(df.values, df_equal.values)

我只需要從數據框中獲取值(numpy 數組),因此不會考慮列名。

df.eq(df_equal.values).all().all()

我仍然希望在equalsassert_frame_equal上看到一個參數。 也許我錯過了一些東西。


與@jpp 答案相比,這樣做的一個優點是,我可以看到哪些列不匹配,只調用all()一次:

df.eq(df_diff.values).all()
Out[24]: 
A     True
B    False
dtype: bool

一個問題是,當使用 eq 時, np.nan不等於np.nan ,在這種情況下,以下表達式將適用:

(df.eq(df_equal.values) | (df.isnull().values & df_equal.isnull().values)).all().all()
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})

for i in range(df1.shape[0]):
    for j in range(df1.shape[1]):
        print(df1.iloc[i, j] == df2.iloc[i, j])

將返回:

True
True
True
True

同樣的事情:

df1 = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
df2 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})

一個明顯的問題是列名在 Pandas 中對數據框排序很重要。 例如:

df1 = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
df2 = pd.DataFrame({'a': [1, 2], 'B': [3, 4]})
print(df1)
print(df2)

呈現為('B' 在 df2 中的 'a' 之前):

   a  b
0  1  3
1  2  4
   B  a
0  3  1
1  4  2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM