Pandas:数据帧合并错误,两列匹配

时间:2017-01-09 11:08:28

标签: pandas join dataframe merge

我有2个数据帧与下面的数据帧非常接近(但是有额外的列但不应影响结果):

修改:根据要求添加了额外的变量。 - 符号表示缺少数据

dataframe1

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

理想情况下,结果应为数据框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匹配。我需要省略这一点。

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

我也试过,正确,内在,外在,合并。

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

1 个答案:

答案 0 :(得分:0)

使用$source = "F:\rbf" $destination = "D:\New" # Create the directory structure first Get-ChildItem -Path $source -Recurse -Force | Where-Object { $_.psIsContainer } | ForEach-Object { $_.FullName -replace [regex]::Escape($source), $destination } | ForEach-Object { $null = New-Item -ItemType Container -Path $_ } # Then copy relevant files Get-ChildItem -Path $source -recurse -include *.txt, *.svc -exclude *backup* | Where-Object { -not $_.psIsContainer } | Copy-Item -Force -Destination { $_.FullName -replace [regex]::Escape($source), $destination }

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 列中有NaN

ProductID