Pandas 比较2个数据框并基于列获取相似性
问题描述
我有2个大小不同的数据框。我想基于列category_id和size比较并得到两个数据框的相似性。结果可以存入一个新的数据框。两个数据框的列长度将相等。
d1 = {'item_id': [1, 2, 3, 4],
'brand': ['E', 'E', 'E', 'E'],
'category_id': [100, 100, 101, 100],
'size': ['S', 'M', 'S', 'L'],
'cost': [8.15, 12.91, 18.44, 14.95],
'sell': [9.95, 14.49, 19.99, 16.79]
}
d2 = {'item_id': [5, 6, 7, 8, 9, 10],
'brand': ['V', 'V', 'V', 'V', 'V', 'V'],
'category_id': [100, 100, 102, 100, 101, 103],
'size': ['S', 'M', 'XL', 'L', 'XS', 'XXL'],
'cost': [9.29, 13.99, 8.44, 10.95, 11.79, 14.95],
'sell': [10.95, 15.49, 12.99, 12.79, 13.69, 17.29]
}
df1 = pd.DataFrame(d1)
df2 = pd.DataFrame(d2)
df1
item_id brand category_id size cost sell
0 1 E 100 S 8.15 9.95
1 2 E 100 M 12.91 14.49
2 3 E 101 S 18.44 19.99
3 4 E 100 L 14.95 16.79
df2
item_id brand category_id size cost sell
0 5 V 100 S 9.29 10.95
1 6 V 100 M 13.99 15.49
2 7 V 102 XL 8.44 12.99
3 8 V 100 L 10.95 12.79
4 9 V 101 XS 11.79 13.69
5 10 V 103 XXL 14.95 17.29
期望的输出:
item_id brand category_id size cost sell
0 1 E 100 S 8.15 9.95
1 5 V 100 S 9.29 10.95
2 2 E 100 M 12.91 14.49
3 6 V 100 M 13.99 15.49
4 4 E 100 L 14.95 16.79
5 8 V 100 L 10.95 12.79
我读到了很多展示差异的解决方案,但是关于相似之处的内容不够。我尝试了下面的代码,但它只显示了来自df1的相似数据。
common_columns = df1.loc[:, df1.columns.isin(df2.columns)]
解决方案
你可以进行双重merge
,一次用于获取共同的值,一次用于将它们从concat
中选择出来:
cols = ['category_id', 'size']
common = df1[cols].drop_duplicates().merge(df2[cols].drop_duplicates())
out = pd.concat([df1, df2]).merge(common)
注意: drop_duplicates
只有在category_id/size的组合可以重复时才需要。
输出:
item_id brand category_id size cost sell
0 1 E 100 S 8.15 9.95
1 5 V 100 S 9.29 10.95
2 2 E 100 M 12.91 14.49
3 6 V 100 M 13.99 15.49
4 4 E 100 L 14.95 16.79
5 8 V 100 L 10.95 12.79
中间 common
:
category_id size
0 100 S
1 100 M
2 100 L