根据相互关联的熊猫获取满足条件的值对

时间:2020-07-08 10:05:45

标签: python pandas networkx graph-theory

假设我有以下数据框:

     index    A      B
     -----------------
      1      A1     B1
      2      A1     B2
      3      A1     B3
      4      A2     B1

我该如何编写代码来返回满足以下条件的这些对(Ax,By),即Ax与不同的B连接的数量大于By与不同的As连接的数量。

在这种情况下,它应该返回(A1,B1),因为A1连接了3个不同的B,但是B1连接了2个不同的As。

2 个答案:

答案 0 :(得分:5)

我们可以将其视为图问题,并检查其中哪个节点degree大于1。然后在两个值均满足条件的行上建立索引:< / p>

import networkx as nx

G = nx.from_pandas_edgelist(df, source='A', target='B')
keep = [node for node, deg in G.degree() if deg>1]
df[df[['A','B']].isin(keep).all(1)]

   index   A   B
0      1  A1  B1

答案 1 :(得分:2)

这是一种方法(为清晰起见,只需几个步骤):

# Drop duplicates in case there are any
df = df.drop_duplicates() 

df["A_count"] = df.groupby("A")["B"].transform("count")
df["B_count"] = df.groupby("B")["A"].transform("count")
df[(df.A_count > df.B_count)]

输出为:

    A   B  A_count  B_count
0  A1  B1        3        2
1  A1  B2        3        1
2  A1  B3        3        1