Python 如何连接两个dataframe并在这样的特定列上对齐?
我想通过连接两个dataframe并在特定列上对齐来做一些工作,如下所示:Python 如何连接两个dataframe并在这样的特定列上对齐?,python,pandas,Python,Pandas,我想通过连接两个dataframe并在特定列上对齐来做一些工作,如下所示: dict3={'name': {0: 'A', 1: 'A', 2: 'A', 3: 'B', 4: 'B', 5: 'B', 6: 'B', 7: 'C', 8: 'C', 9: 'C'}, 'abstract_right': {0: 'A1', 1: 'A2', 2: nan, 3: 'B1', 4: 'B2', 5: 'B3', 6: nan, 7: 'C1', 8: 'C2', 9: 'C3'},
dict3={'name': {0: 'A', 1: 'A', 2: 'A', 3: 'B', 4: 'B', 5: 'B', 6: 'B', 7: 'C', 8: 'C', 9: 'C'},
'abstract_right': {0: 'A1', 1: 'A2', 2: nan, 3: 'B1', 4: 'B2', 5: 'B3', 6: nan, 7: 'C1', 8: 'C2', 9: 'C3'},
'abstract_left': {0: 'A1', 1: 'A2', 2: 'A3', 3: 'B1', 4: 'B2', 5: 'B3', 6: 'B4', 7: 'C1', 8: 'C2', 9: nan}}
combined=pd.DataFrame(dict3)
数据帧左像:
dict1={'abstract': {0: 'A1', 1: 'A2', 2: 'A3', 3: 'B1', 4: 'B2', 5: 'B3', 6: 'B4', 7: 'C1', 8: 'C2'},
'name': {0: 'A', 1: 'A', 2: 'A', 3: 'B', 4: 'B', 5: 'B', 6: 'B', 7: 'C', 8: 'C'}}
left=pd.DataFrame(dict1)
数据帧右键类似:
dict2={'abstract': {0: 'A1', 1: 'A2', 2: 'B1', 3: 'B2', 4: 'B3', 5: 'C1', 6: 'C2', 7: 'C3'},
'name': {0: 'A', 1: 'A', 2: 'B', 3: 'B', 4: 'B', 5: 'C', 6: 'C', 7: 'C'}}
right=pd.DataFrame(dict2)
我想得到一个这样的组合数据帧:
dict3={'name': {0: 'A', 1: 'A', 2: 'A', 3: 'B', 4: 'B', 5: 'B', 6: 'B', 7: 'C', 8: 'C', 9: 'C'},
'abstract_right': {0: 'A1', 1: 'A2', 2: nan, 3: 'B1', 4: 'B2', 5: 'B3', 6: nan, 7: 'C1', 8: 'C2', 9: 'C3'},
'abstract_left': {0: 'A1', 1: 'A2', 2: 'A3', 3: 'B1', 4: 'B2', 5: 'B3', 6: 'B4', 7: 'C1', 8: 'C2', 9: nan}}
combined=pd.DataFrame(dict3)
如何使用Pandas?您可能对该功能感兴趣
您需要的不是连接,而是连接,因为它们必须由
名称
匹配。您可以创建一个id
列来帮助合并和对齐行:
left['id'] = left.groupby('name').cumcount()
right['id'] = right.groupby('name').cumcount()
left.merge(right, on=['id', 'name'], how='outer', suffixes=['_left', '_right']).drop('id', axis=1)
您可以将值从何处与其他信息合并,并添加 左栏和右栏后面:
res = pd.merge(left, right, how='outer', indicator=True)
res['abstract_left'] = res.abstract[res._merge != 'right_only']
res['abstract_right'] = res.abstract[res._merge != 'left_only']
res.drop(['abstract', '_merge'], axis=1)
步调一致
进行外部联接:
res = pd.merge(left, right, how='outer', indicator=True)
结果是:
现在,根据\u merged
中的值添加两列:
res['abstract_left'] = res.abstract[res._merge != 'right_only']
res['abstract_right'] = res.abstract[res._merge != 'left_only']
并删除不需要的列:
res.drop(['abstract', '_merge'], axis=1)
最后的结果。非常感谢。我尝试了merge函数,但添加了“on='name'”并得到了一个24*4的数据帧。默认情况下,它位于两个数据帧中具有相同名称的所有列上。所以这里是
on=['name','abstract']
,因为两个数据帧都有这两列。非常感谢。我不知道来自其他信息的帮助。。。就像处理几何问题一样