假设我有以下数据框:
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。
答案 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