如何在具有多个数据帧的panda中使用merge来查找唯一元素



我使用三个数据帧:df_1df_2df_3

它们具有不同数量的行和列以及不同的信息。每个数据帧都按国家名称进行索引,因此这就是连接它们的原因。

这个想法是找到三者的交集,并确定在进行交集时丢失了多少独特的元素。

我首先从创建这些df的函数中调用它们:

df_1, df_2, df_3 = load_data()
merged_1 = pd.merge(df_1, df_2, how = 'inner', left_index = True, right_index = True)
merged_2 = pd.merge(merged_1, df_3, how = 'inner', left_index = True, right_index = True)
unique_df_1 = pd.merge(df_1, merged_2, how = 'left', left_index = True, right_index = True, 
indicator = True).query('_merge=="left_only"')
unique_df_2 = pd.merge(df_2, merged_2, how = 'left', left_index = True, right_index = True, 
indicator = True).query('_merge=="left_only"')
unique_df_3 = pd.merge(df_3, merged_2, how = 'left', left_index = True, right_index = True,
indicator = True).query('_merge=="left_only"')
return (len(unique_df_1)+len(unique_df_2)+len(unique_df_3))

这是我第一篇关于堆栈溢出的文章,所以我希望我做的每件事都是正确的。如果我没有,或者我的文字不清楚,请道歉。

df1 = pd.DataFrame({'z1':range(6), 'z2':[5,3,6,9,2,4]}, index=list('abcdef'))
df2 = pd.DataFrame({'x1':range(4), 'x2':[10,20,30, 40]}, index=list('abhi'))
df3 = pd.DataFrame({'y1':range(5), 'y2':[11,22,33, 44, 55]}, index=list('abktf'))
print(df1)
z1  z2
a   0   5
b   1   3
c   2   6
d   3   9
e   4   2
f   5   4
print(df2)
x1  x2
a   0  10
b   1  20
h   2  30
i   3  40
print(df3)
y1  y2
a   0  11
b   1  22
k   2  33
t   3  44
f   4  55
df4 = pd.merge(df1, df2, left_index=True, right_index=True)
df5 = pd.merge(df4, df3, left_index=True, right_index=True)
print(df5)
z1  z2  x1  x2  y1  y2
a   0   5   0  10   0  11
b   1   3   1  20   1  22

你在寻找那些独特的/缺失的国家吗?你可以用一种简单得多的方法:

set_1 = set(df1.index)
set_2 = set(df2.index)
set_3 = set(df3.index)
print(set_1)
print(set_2)
print(set_3)
>> {'d', 'b', 'e', 'a', 'f', 'c'}
>> {'a', 'i', 'b', 'h'}
>> {'b', 't', 'f', 'a', 'k'}

您可以通过以下方式获得所有三个集合之间的交集:

set_4 = set_1.intersection(set_2).intersection(set_3)
print(set_4)
>> {'a', 'b'}

df1:中缺失的国家

print(set_1.difference(set_4))
>> {'d', 'f', 'c', 'e'}

如果这不是你想要的,请告诉我。或者,如果有任何特定的数据点你试图比较。

最新更新