Skip to main content
 首页 » 编程设计

python之Pandas 'concat/upsert' 数据帧

2025年05月04日21虾米哥

我正在寻找一种有效的方法来根据共享行值在 2 x 数据框中选择匹配行,并将它们插入到一个新的数据框中,我可以使用它来将它们的交集之间的差异映射到第三个略有不同的数据框中比较它们。

**Example:** 
 
DataFrame1 
FirstName, City 
Mark, London 
Mary, Dallas 
Abi, Madrid 
Eve, Paris 
Robin, New York 
 
DataFrame2 
FirstName, City 
Mark, Berlin 
Abi, Delhi 
Eve, Paris 
Mary, Dallas 
Francis, Rome 

在数据框中,我在“名称”上有潜在的匹配/重叠,所以它们的交集是:

Mark, Mary, Abi, Eve 

从连接中排除的是:

Robin, Francis 

我构建了一个数据框,允许比较两者的值:

DataFrameMatch 
FirstName_1, FirstName_2, FirstName_Match, City_1, City_2, City_Match 

然后插入/更新(upsert)所以我的输出是:

DataFrameMatch 
FirstName_1  FirstName_2  FirstName_Match  City_1  City_2  City_Match 
Mark         Mark         True             London  Berlin  False 
Abi          Abi          True             Madrid  Delhi   False 
Mary         Mary         True             Dallas  Dallas  True 
Eve          Eve          True             Paris   Paris   True 

然后我可以报告两个列表之间的差异,以及哪些特定字段不同。

请您参考如下方法:

合并

根据您的输出。您只需要 'FirstName' 匹配的行。然后,您需要另一列来评估城市是否匹配。

d1.merge(d2, on='FirstName', suffixes=['_1', '_2']).eval('City_Match = City_1 == City_2') 
 
  FirstName  City_1  City_2  City_Match 
0      Mark  London  Berlin       False 
1      Mary  Dallas  Dallas        True 
2       Abi  Madrid   Delhi       False 
3       Eve   Paris   Paris        True 

详情

你可以做一个简单的merge并结束

  FirstName    City 
0      Mary  Dallas 
1       Eve   Paris 

默认情况下采用所有公共(public)列。所以我不得不通过 on 参数限制列,因此 on='FirstName'

d1.merge(d2, on='FirstName') 
 
  FirstName  City_x  City_y 
0      Mark  London  Berlin 
1      Mary  Dallas  Dallas 
2       Abi  Madrid   Delhi 
3       Eve   Paris   Paris 

这让我们更接近,但现在我想调整这些后缀。

d1.merge(d2, on='FirstName', suffixes=['_1', '_2']) 
 
  FirstName  City_1  City_2 
0      Mark  London  Berlin 
1      Mary  Dallas  Dallas 
2       Abi  Madrid   Delhi 
3       Eve   Paris   Paris 

最后,我将添加一个新列,显示 'city_1' 等于 'city_2' 的评估。我选择使用 pandas.DataFrame.eval。你可以看到上面的结果。