【问题标题】:Displaying the unique elements from the two columns in two dataframe在两个数据框中显示来自两列的唯一元素
【发布时间】:2017-10-27 04:26:51
【问题描述】:
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

【问题讨论】:

  • 可以在一个数据框中显示输出吗?
  • 我想将它们显示为单独的数据框。
  • 哦,我想我现在明白了。您只想检查单个节点是否唯一。不是组合!嗯,jez 的答案可能就是你想要的。

标签: python pandas dataframe


【解决方案1】:

您需要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

【讨论】:

  • 我的实际日期格式为 1998-03-12。这会有所不同吗?谢谢
  • 第一行的错误是keyerror:'date'
  • 这是你的专栏名称dateprint (df1.columns.tolist()) 是什么?
  • 对于大中型数据集来说,更快的替代方案真的很有帮助。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多