Python 熊猫中的求和边

Python 熊猫中的求和边,python,pandas,Python,Pandas,有一个数据帧,表示节点a、B和C之间具有定向边的网络。我想对节点之间的流求和,以测量节点之间连接的强度。下面是我的df To From Flow A A 1 A B 4 A C 2 B A 5 B B 2 B C 6 C A 3 C B 5 C C 2 下面是我想了解的内容 A A 1 B B 2 C C 2 A B 9 A C 5 B C 11 最好的方法是什么?这里有

有一个数据帧,表示节点a、B和C之间具有定向边的网络。我想对节点之间的流求和,以测量节点之间连接的强度。下面是我的df

To  From Flow
A   A   1
A   B   4
A   C   2
B   A   5
B   B   2
B   C   6
C   A   3
C   B   5
C   C   2
下面是我想了解的内容

A   A   1
B   B   2
C   C   2
A   B   9
A   C   5
B   C   11

最好的方法是什么?

这里有一种方法可以解决这个问题

df["Node 1"] = df[["To","From"]].min(axis=1)
df["Node 2"] = df[["To","From"]].max(axis=1)
result = df.groupby(["Node 1","Node 2"], as_index=False)["Flow"].sum()

前两行只是为组创建了一致的顺序。第三行只是将组相加,现在有了一个一致的分组。

为了它的价值,我尝试了两种稍微不同的方法:

一,

二,

data=pd.DataFrame(data={“To”:[“A”、“A”、“A”、“B”、“B”、“C”、“C”],
“发件人”:[“A”、“B”、“C”、“A”、“B”、“C”、“A”、“B”、“C”、“A”、“B”、“C”],
“流”:[1,4,2,5,2,6,3,5,2]})
swap=data.To

两者的性能都比Gabriel A的解决方案差得多,Gabriel A的解决方案非常好:)

在熊猫中,最快的解决方案通常包括使用内置的矢量化函数。您的第一个代码是对每行进行排序的更自然的方式,但应用速度较慢:/
data = pd.DataFrame(data={"To": ["A", "A", "A", "B", "B", "B", "C", "C", "C"],
                          "From": ["A", "B", "C", "A", "B", "C", "A", "B", "C"],
                          "Flow": [1, 4, 2, 5, 2, 6, 3, 5, 2]})

data[["To", "From"]] = data[["To", "From"]].apply(sorted, axis=1)
data.groupby(by=["To", "From"], as_index=False).sum()
data = pd.DataFrame(data={"To": ["A", "A", "A", "B", "B", "B", "C", "C", "C"],
                          "From": ["A", "B", "C", "A", "B", "C", "A", "B", "C"],
                          "Flow": [1, 4, 2, 5, 2, 6, 3, 5, 2]})

swap = data.To < data.From
data.loc[swap, ["To", "From"]] = data.loc[swap, ["From", "To"]].values
data.groupby(by=["From", "To"], as_index=False).sum()