比较两个Pandas数据框的内容,即使行的顺序不同。

9
我有两个pandas数据帧,它们的行以不同的顺序排列,但包含相同的列。 我的目标是轻松比较这两个数据帧并确认它们都包含相同的行。
我尝试了“equals”函数,但似乎缺少某些东西,因为结果与预期不符:
df_1 = pd.DataFrame({1: [10,15,30], 2: [20,25,40]})
df_2 = pd.DataFrame({1: [30,10,15], 2: [40,20,25]})
df_1.equals(df_2)

我期望的结果是True,因为这两个数据框包含相同的行,只是顺序不同,但实际返回的是False。

1
你不能先排序吗? - rafaelc
我认为在实际例子中并不那么容易,因为我需要按多列进行排序。这种同时排序会起作用吗? - jotNewie
1
我相信是这样的...试一下,看看吧。 - rafaelc
3个回答

13
你可以在 DataFrame.sort_values 中指定要排序的列 - 在我的解决方案中,通过对所有列进行排序和使用 DataFrame.reset_index 并设置 drop=True 来为两个 DataFrames 设置默认索引:
df11 = df_1.sort_values(by=df_1.columns.tolist()).reset_index(drop=True)
df21 = df_2.sort_values(by=df_2.columns.tolist()).reset_index(drop=True)
print (df11.equals(df21))
True

2
尝试排序并重置索引。"Original Answer"翻译成"最初的回答"。
df_1.sort_values(by=[1,2]).equals(df_2.sort_values(by=[1,2]).reset_index(drop=True))

0

如果两个相似的数据框的列和行排序不同,以下是解决方案:

对列进行排序

df_1 = df_1[df_2.columns]

选择按列排序行。
ref_len = 0
for col in df_1.columns:
    if(len(set(df_1[col])) > ref_len):
        final_col = col
        ref_len = len(set(df_1[col]))

排序行

df11 = df_1.sort_values(by=[final_col]).reset_index(drop=True)
df21 = df_2.sort_values(by=[final_col]).reset_index(drop=True)

df11.equals(df21)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接