我正在寻找一种有效的方法来根据共享行值在 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。你可以看到上面的结果。
