【问题标题】:Compare two dataframes and create comparison matrix in Python?比较两个数据框并在 Python 中创建比较矩阵?
【发布时间】:2020-05-02 15:32:43
【问题描述】:

Emp_rating_df

  Emp_Id       A1   A2   A3   A4
0 1001         4    3    6    7
1 1002         7    2    4    5
2 1003         3    8    2    6
3 1004         7    5    4    7

Comp_df

  Emp_Id       A1   A2   A3   A4
0 1001         4    3    6    7

我需要比较两个包含员工评分的df。

Emp_rating_df 包含员工评分(满分 10),Comp_df 告诉哪个员工与来自Emp_rating_df 的所有员工进行比较。

如果 emp A 的评分高于任何特定优势列(A1、A2、A3、A4),则 emp B 则为 2,如果相同则为 1,否则为 0。

输出_df-

 Emp_Id       A1   A2   A3   A4
0 1001         1    1    1    1 
1 1002         0    2    2    2
2 1003         2    0    2    2
3 1004         0    0    2    1

由于自我比较,第一行将是 1。

【问题讨论】:

  • 对于 Emp 1002 ,列 A1 是 7 大于 4 ,为什么在您的预期输出中没有分配 2 ?
  • 嗨,我已经更新了问题,请查看。
  • 再次对于相同的 Emp 1002 ,与 7 相比,A4 列是 5 ,所以 7 更大因此 A4 列不应该是 2 吗?您可以重新检查所有值并更新吗?
  • 对不起……再次更新

标签: python python-3.x pandas python-2.7


【解决方案1】:

您可以尝试以下方法:

第一次合并过滤:

m = Emp_rating_df.merge(Comp_df,'left','Emp_Id').ffill().bfill()
a = m.filter(like='_x')
b = m.filter(like='_y')

然后按条件赋值:

cond1 = b.to_numpy() > a.to_numpy()
cond2 = b.to_numpy() == a.to_numpy()
Output = Emp_rating_df.copy()
Output[a.columns.str.split('_').str[0]] = np.select([cond1,cond2],[2,1],0)

print(Output)

   Emp_Id  A1  A2  A3  A4
0    1001   1   1   1   1
1    1002   0   2   2   2
2    1003   2   0   2   2
3    1004   0   0   2   1

【讨论】:

  • 为什么你使用 bfill() 甚至 ffill() 也会给你同样的结果?
  • 超过3个条件怎么处理。就像我想看到 b.to_numpy() - a.to_numpy() > 5 然后 2,就像另外两个三个条件一样。
  • @harsh 然后将 cond3 定义为您提到的条件,并将其与 cond 1 和 cond2 一起传递到列表中,并在当前给出 2,1 的值列表中添加另一个 2,即 2,1 ,2
  • 我在列级别 cond1 = (b.to_numpy()[:, :1] - a.to_numpy()[:, :1] > 5), cond2 = b 上创建了 5 个不同的条件。 to_numpy()[:, 1:2] == a.to_numpy()[:, 1:2], cond3 = b.to_numpy()[:, 2:3]
  • 没有样本数据很难说。您可以创建一个新问题,因为此问题已得到解答,并且有人在线可以帮助您。 @苛刻
猜你喜欢
  • 2022-11-18
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多