显示两个数据框中两列的唯一元素

时间:2017-10-27 04:26:51

标签: python pandas 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 1999

dataframe2:5 2002

1 个答案:

答案 0 :(得分:2)

您需要melt进行重塑,然后merge获取唯一值,最后按boolean indexing过滤:

a = df1.drop('weight',1).melt('date', value_name='node').drop('variable',1)
b = df2.drop('weight',1).melt('date', value_name='node').drop('variable',1)

更快的替代方案:

a = pd.DataFrame({'date':np.repeat(df1['date'], 2), 
                  'node':df1[['node1','node2']].values.ravel()})
b = pd.DataFrame({'date':np.repeat(df2['date'], 2), 
                  'node':df2[['node1','node2']].values.ravel()})
c = pd.merge(a, b, how='outer', indicator=True, on='node')

d = c.loc[c['_merge'] == 'left_only', ['date_x', 'node']]
print (d)
   date_x  node
25   1999     8

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

详情:

print (a)
   date  node
0  1998     1
1  1999     1
2  1999     2
3  2000     3
4  1999     3
5  1998     3
6  1999     4
7  1999     3
8  2000     4
9  1999     8

print (b)
    date  node
0   2002     1
1   2001     1
2   2003     1
3   2002     2
4   2002     2
5   2001     3
6   2002     2
7   2001     3
8   2003     4
9   2002     3
10  2002     5
11  2001     4