检测 DataFrame 的两列中是否存在反向对

Detect presence of inverse pairs in two columns of a DataFrame

我有一个包含两列的数据框; source,以及 target。我想检测反向行,即对于一对值 (source, target),如果存在一对值 (target, source),则将 True 分配给一个新列。

我的尝试:

cols = ['source', 'target']
_cols = ['target', 'source']
sub_edges = edges[cols]
sub_edges['oneway'] = sub_edges.apply(lambda x: True if x[x.isin(x[_cols])] else False, axis=1)

您可以使用与示例中类似的逻辑来应用 lambda 函数。我们检查数据框中是否有任何行具有反向 source/target 对。

顺便说一下,列名 'oneway' 向我表明与你问题中描述的逻辑相反,但要改变这一点,我们只需删除 lambda 函数中的 not

代码

import pandas as pd
import random

edges = {"source": random.sample(range(20), 20),
         "target": random.sample(range(20), 20)}

df = pd.DataFrame(edges)

df["oneway"] = df.apply(
    lambda x: not df[
        (df["source"] == x["target"]) & (df["target"] == x["source"]) & (df.index != x.name)
    ].empty,
    axis=1,
)

输出

    source  target  oneway
0        9      11   False
1       16       1    True
2        1      16    True
3       11      14   False
4        4      13   False
5       18      15   False
6       14      17   False
7       13      12   False
8       19      19   False
9       12       3   False
10      10       6   False
11      15       5   False
12       3      18   False
13      17       0   False
14       6       7   False
15       5      10   False
16       7       2   False
17       8       9   False
18       0       4   False
19       2       8   False