Python 熊猫中的求和边
有一个数据帧,表示节点a、B和C之间具有定向边的网络。我想对节点之间的流求和,以测量节点之间连接的强度。下面是我的dfPython 熊猫中的求和边,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 最好的方法是什么?这里有
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()