熊猫的'concat / upsert'数据框

时间:2018-09-26 16:01:49

标签: python pandas

我正在寻找一种基于共享行值在2个数据框中选择匹配行的有效方法,然后将它们向上插入到一个新的数据框中,可以用来将它们之间的交集映射到第三个稍有不同的数据框中,比较它们。

**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

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

1 个答案:

答案 0 :(得分:5)

merge

根据您的输出。您只需要'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

默认情况下,哪个都采用所有公共列。所以我不得不通过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。您可以在上面看到结果。