我有2个不同大小的行的数据框.我想要比较两个数据框之间的相似性,并基于两个列:ategory_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

我读过很多显示不同之处的解决方案,但谈到相似之处时,就不多了.我try 了下面的代码,但它只显示了df1中的相似性数据.

common_columns = df1.loc[:, df1.columns.isin(df2.columns)]

这个solution是最接近的,但它的行长相等,所以我认为它在我的情况下不会起作用.

推荐答案

您可以执行双merge,一次以获得公共值,一次以从concat中 Select 它们:

cols = ['category_id', 'size']

common = df1[cols].drop_duplicates().merge(df2[cols].drop_duplicates())

out = pd.concat([df1, df2]).merge(common)

NB. 100 is only needed if you can have duplicated combinations of 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

Python相关问答推荐

使用子字符串动态更新Python DataFrame中的列

如何分割我的收件箱,以便连续的数字各自位于自己的收件箱中?

零填充2D数组上的Numpy切片

如何在Python中增量更新DF

在Python中管理多个OpenGVBO和VAO实例

将轨迹优化问题描述为NLP.如何用Gekko解决这个问题?当前面临异常:@错误:最大方程长度错误

列表上值总和最多为K(以O(log n))的最大元素数

如何根据另一列值用字典中的值替换列值

Pandas 填充条件是另一列

Pandas 第二小值有条件

Pydantic 2.7.0模型接受字符串日期时间或无

替换字符串中的多个重叠子字符串

如何使用symy打印方程?

如何根据参数推断对象的返回类型?

使用setuptools pyproject.toml和自定义目录树构建PyPi包

Python解析整数格式说明符的规则?

有没有一种方法可以从python的pussompy比较结果中提取文本?

NumPy中条件嵌套for循环的向量化

改进大型数据集的框架性能

如何创建引用列表并分配值的Systemrame列