Python 熊猫中的有向图
我试图找出图中哪些边是双向的。每行是一条边。对于每个起始节点A,我正在搜索每个对应的结束节点B,如果它们将节点A作为结束点:Python 熊猫中的有向图,python,pandas,Python,Pandas,我试图找出图中哪些边是双向的。每行是一条边。对于每个起始节点A,我正在搜索每个对应的结束节点B,如果它们将节点A作为结束点: for ending_point_B in nodeA: nodeA in ending_points_of_B 忽略df['S']中现在重复的条目。如何优化此搜索?我怀疑有点像groupby。对于我的真实图形,这种方式花费了太多的时间 多谢各位 from pandas import * def missing_node(node): set1 = s
for ending_point_B in nodeA:
nodeA in ending_points_of_B
忽略df['S']中现在重复的条目。如何优化此搜索?我怀疑有点像groupby。对于我的真实图形,这种方式花费了太多的时间
多谢各位
from pandas import *
def missing_node(node):
set1 = set(df[df.E == node].S.values)
set2 = set(df.E[df.S == node].values)
return list(set1.difference(set2))
x = [1,1,2,2,3]
y = [2,3,1,3,1]
df = DataFrame([x,y]).T
df.columns = ['S','E'] #Start & End
df['Missing'] = df.S.apply(missing_node)
df:
S E Missing
0 1 2 []
1 1 3 []
2 2 1 []
3 2 3 []
4 3 1 [2]
如果我正确理解您的问题,您需要找到所有非双向的节点对。在上面的示例中,只有这样一对节点是2和3。鉴于此,您可以执行以下操作:
In [1]: df['is_bi'] = df.index.map(lambda x: np.any(map(lambda y: np.all(y), df.ix[x][['E', 'S']].values == df.values)))
In [2]: df
Out[2]:
S E is_bi
0 1 2 True
1 1 3 True
2 2 1 True
3 2 3 False
4 3 1 True
因此df[-df.is_bi]
将为您提供所有非双向的节点对:
In [3]: df[-df.is_bi][['S', 'E']]
Out[3]:
S E
3 2 3
x = [1,1,2,2,3]
y = [2,3,1,3,1]
fwd = set( zip(x,y) )
rev = set( zip(y,x) )
print ' not bi: ', fwd.difference(rev)
我觉得这太复杂了,一定有办法用pandas本机函数来实现,但上面的解决方案可以做到这一点。pandas很棒,但不确定您是否需要它。类似于以下内容的内容将为您提供非双向链接:
In [3]: df[-df.is_bi][['S', 'E']]
Out[3]:
S E
3 2 3
x = [1,1,2,2,3]
y = [2,3,1,3,1]
fwd = set( zip(x,y) )
rev = set( zip(y,x) )
print ' not bi: ', fwd.difference(rev)
这将返回:
非bi:set([(2,3)])
是的,我不需要熊猫,但对于后验分析来说,它变得很有用,只是想更好地理解熊猫的数据结构。谢谢你的拉链提示。