Pandas 比较2个数据框并基于列获取相似性

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

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程