【问题标题】:Pandas : Dataframe Merge Error with two columns matchPandas:两列匹配的数据框合并错误
【发布时间】:2017-05-23 15:11:42
【问题描述】:

我有 2 个数据框,它们看起来与下面的一个非常接近(有额外的列,但不应该影响结果):

编辑:根据要求添加了额外的变量。 - 号表示缺失数据

数据框1

ProductID      Date           Booked Rate

10             01/01/2017     10.0
10             02/01/2017     0.3
10             03/01/2017      70.4
20             01/01/2017     100.0
20             02/01/2017      70.0
20             03/01/2017     0.1
-              04/01/2017      0.5

dataframe2

ProductID      Date           Actual Rate

10             01/01/2017     11.0
10             02/01/2017     12.3
10             03/01/2017      75.4
20             01/01/2017     110.0
20             02/01/2017     80.0
30             03/01/2017     10.1
-              04/01/2017     0.7

理想情况下,结果应该是 dataframe 3:

 ProductID      Date          Booked Rate   Actual Rate

 10            01/01/2017     10.0         11.0
 10            02/01/2017     0.3          12.3
 10            03/01/2017      70.4         75.4
 20            01/01/2017     100.0        110.0
 20            02/01/2017     70.0         80.0
 20            03/01/2017     0.1          -
 -             04/01/2017     0.5          -

当我对我的真实数据集进行合并时,使用以下代码:

df3 = pd.merge(left=df1, right=df2, how="left", left_on=["ProductID", "Date"], right_on=["ProductID", "Date"])

我得到了错误的结果,因为额外列中的数字(为清楚起见而省略)有时会加倍/三倍。

编辑: 这似乎是因为它将 dataframe1 中的空 ProductID 字段与 dataframe2 中的空 productID 匹配。我需要省略这个。

我真正需要的是一个简单的合并,当它在 dataframe1 中找到与 productId 和 Date 匹配时,将 dataframe2 的实际速率添加为新列。应排除 dataframe2 中的任何额外项,并且不应排除 dataframe1 中的任何匹配项。

我也试过了,对,内,外,合并。

它似乎总是以完全相同的方式扭曲结果(将某些订单项加倍和三倍)。

【问题讨论】:

  • 格式错误的日期是故意的吗?
  • - 是否意味着它缺少或等于字符串'-'

标签: pandas join dataframe merge


【解决方案1】:

使用pd.merge

dataframe1.merge(dataframe2, on=['ProductID', 'Date'], how='left')

   ProductID        Date  Booked Rate  Actual Rate
0         10  01/01/2017         10.0         11.0
1         10  02/01/2017          0.3         12.3
2         10  03/01/2017         70.4         75.4
3         20  01/01/2017        100.0        110.0
4         20  02/01/2017         70.0         80.0
5         20  03/01/2017          0.1          NaN

如果您的ProductID 列中有NaN

d1 = dataframe1.dropna(subset=['ProductID'])
d2 = dataframe2.dropna(subset=['ProductID'])

print(d1.merge(d2, on=['ProductID', 'Date'], how='left'))

  ProductID        Date  Booked Rate  Actual Rate
0        10  01/01/2017         10.0         11.0
1        10  02/01/2017          0.3         12.3
2        10  03/01/2017         70.4         75.4
3        20  01/01/2017        100.0        110.0
4        20  02/01/2017         70.0         80.0
5        20  03/01/2017          0.1          NaN

【讨论】:

  • 嗨@pirSquared 我也尝试过这种方法,我的额外列之一(印象数)在这种类型的合并之后也从 493763131 传递到 561349264。我认为有些变量我没有考虑到
  • 这就是为什么向我们展示您的尝试以及重现问题的示例很重要的一个例子。实际上,您问了一个简单的问题并收到了该问题的答案。给出答案后,你提出还有其他事情需要考虑。我很欣赏提出一个好的和完整的问题有时很困难。但是你可以从这次经历中学习如何更好地表达你未来的需求。希望这会有所帮助,因为这就是我的意思。使用相关信息编辑您的问题。
  • 嗨@pRSquared,你是完全正确的。我会修改信息,我认为我发现了问题,即当两个数据帧中缺少Product ID的信息时,它会认为它是匹配的
  • 嗨@pRsquared,现在刚刚完成数据编辑,抱歉花了一点时间,但目前正在电话中!谢谢您的帮助。我想我现在可能需要一个函数来保留 dataframe1 中缺少的 productId 行
猜你喜欢
  • 2021-07-22
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 2021-08-20
  • 2017-01-20
相关资源
最近更新 更多