[英]Directed graph in pandas
我试图找出图中的哪些边是双向的。 每行都是一条边。 对于每个起始节点A,如果它们以节点A为终点,我将搜索每个相应的结束节点B:
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
我觉得我对此过于复杂,必须使用pandas原生函数来做到这一点,但是上述解决方案可以解决问题。
熊猫很棒,但不确定在这里是否需要它。 类似以下内容的链接应该不是双向的:
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)])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.