搜索两个数据帧的两列中的唯一元素

时间:2017-10-27 07:02:19

标签: python pandas dataframe

从这里Displaying the unique elements from the two columns in two dataframe

data1 = {'date': ['1998', '1999','1999','2000','1999'], 
        'node1': [1,1,2,3,3],
     'node2': [3,4,3,4,8],
     'weight': [1,1,1,1,1], }
df1 = pd.DataFrame(data1, columns = ['date', 'node1','node2','weight'])

data2 = {'date': ['2002','2001','2003','2002','2002','2001'], 
        'node1': [1,1,1,2,2,3],
     'node2': [2,3,4,3,5,4],
     'weight': [1,1,1,1,1,1], }
df2= pd.DataFrame(data2, columns = ['date', 'node1','node2','weight'])

我想搜索两个数据帧中的两列(node1,node2),并显示两个数据帧中唯一的节点。在此示例中,来自data1的8和来自data2的5是数据帧中的唯一节点。

输出格式:

dataframe1:8

dataframe2:5

2 个答案:

答案 0 :(得分:1)

使用位merge修改前一个答案:

a = pd.DataFrame({'node':df1[['node1','node2']].values.ravel()})
b = pd.DataFrame({'node':df2[['node1','node2']].values.ravel()})

c = pd.merge(a, b, how='outer', indicator=True, on='node')
#
d = c.loc[c['_merge'] == 'left_only', ['node']]
print (d)
    node
25     8

e = c.loc[c['_merge'] == 'right_only', ['node']]
print (e)
    node
26     5

但如果表现很重要,请使用numpy.setdiff1d

a = df1[['node1','node2']].values.ravel()
b = df2[['node1','node2']].values.ravel()

d = np.setdiff1d(a,b)
print (d)
[8]

e = np.setdiff1d(b,a)
print (e)
[5]

答案 1 :(得分:1)

使用pd.concatpd.Series.drop_duplicates

cols = ['node1', 'node2']
pd.concat(
    [d[cols] for d in [df1, df2]],
    keys=[1, 2]
).stack().drop_duplicates(keep=False).reset_index([1, 2], drop=True)

1    8
2    5
dtype: int64