pandas 找到两列数据之间的重复对

问题描述 投票:0回答:2

我有一个包含 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
python pandas
2个回答
1
投票

您可以聚合为

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

0
投票

一个可能的解决方案:

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
© www.soinside.com 2019 - 2024. All rights reserved.