[英]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]})
在這種情況下, df
是df_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()
我仍然希望在equals
或assert_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.