我正在寻找一种基于共享行值在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
然后我可以报告两个列表之间的差异以及哪些特定字段不同。
答案 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
。您可以在上面看到结果。