我有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中的任何匹配项。
我也试过,正确,内在,外在,合并。
似乎总是以相同的方式扭曲结果(将某些行项加倍和三倍)。
答案 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