从两个数据框中的两列获取非公共元素

时间:2017-10-26 17:37:57

标签: 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'])

我想搜索每个数据帧中的两列,然后输出其中包含非公共元素的行。

此数据的输出为:

dataframe1:3 8 1999

dataframe2:2 5 2002

输出说明 - 通过搜索两个数据帧中的两行,我们发现5和8是非常见元素,因此打印包含它们的行。

修改了编辑数据。

1 个答案:

答案 0 :(得分:1)

所以这可能不是最好的答案,但它有效:

dfs = pd.concat([df1, df2])
nodes = pd.concat([dfs['node1'], dfs['node2']])
counts = nodes.value_counts()
unique = []

for index, value in zip(counts.index, counts.tolist()):
    if value == 1:
        unique.append(index)

unique_df1 = df1[(df1['node1'].isin(unique)) | ((df1['node2'].isin(unique)))]
unique_df2 = df2[(df2['node1'].isin(unique)) | ((df2['node2'].isin(unique)))]

print(unique_df1)
print(unique_df2)

输出:

   date  node1  node2  weight
4  1999      3      8       1
   date  node1  node2  weight
4  2002      2      5       1