我有一个包含 3 列的数据集。这些是节点之间的边缘连接以及连接的强度。我想做的是找到并合并当方向朝相反方向时可能出现的额外边缘。
作为一个简短的例子
data_frame = pd.DataFrame({"A":["aa", "aa", "aa", "bb", "bb", "cc", "dd", "dd"],
"B":["bb", "cc", "dd", "aa", "dd", "aa", "ee", "aa"],
"C":[4,3,4,5,3,4,2, 5]})
生成的节点图
aa - bb
| \ |
cc dd -- ee
从节点来看,我们有重叠,因为“aa - bb”与“bb - aa”相同,与“aa - dd”和“dd - aa”相同
我考虑过将 A 和 B 向前和向后合并在一起,连接两个数据帧,然后执行
group_by().sum()
但我最终得到了需要在之后删除的额外内容。
理想情况下这就是它的工作方式
A | B | C A | B | C
aa bb 4 aa bb 9
aa cc 3 aa cc 7
aa dd 4 aa dd 9
bb aa 5 bb dd 3
bb dd 3 --> dd ee 2
cc aa 4
dd ee 2
dd aa 5
您可以聚合为
frozenset
,然后执行 groupby.sum
:
out = (data_frame['C']
.groupby(data_frame[['A', 'B']].agg(frozenset, axis=1))
.sum()
.reset_index()
)
输出:
index C
0 (bb, aa) 9
1 (cc, aa) 7
2 (dd, aa) 9
3 (bb, dd) 3
4 (ee, dd) 2
或者排序,并且
groupby.sum
:
tmp = data_frame.copy()
tmp[['A', 'B']] = np.sort(data_frame[['A', 'B']], axis=1)
out = tmp.groupby(['A', 'B'], as_index=False).sum()
输出:
A B C
0 aa bb 9
1 aa cc 7
2 aa dd 9
3 bb dd 3
4 dd ee 2
一个可能的解决方案:
df[["A", "B"]] = pd.DataFrame.from_records(df[["A", "B"]].apply(sorted, axis=1))
df.groupby(['A','B'], as_index=False)['C'].sum()
输出:
A B C
0 aa bb 9
1 aa cc 7
2 aa dd 9
3 bb dd 3
4 dd ee 2