【问题标题】:Detect presence of inverse pairs in two columns of a DataFrame检测 DataFrame 的两列中是否存在逆对
【发布时间】:2021-05-08 13:41:26
【问题描述】:

我有一个包含两列的数据框; sourcetarget。我想检测反向行,即一对值(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)

【问题讨论】:

标签: python pandas dataframe graph networkx


【解决方案1】:

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

顺便说一句,列名“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

【讨论】:

  • 非常感谢。这就是我一直在寻找的
  • 我注意到一个错误,第 8 行不应该是真的,而是假的。我发现我得到了比预期更多的真实价值。我该如何纠正它?
  • @aba2s 第 8 行是 True,因为从节点 19 到它自己有一条边。这不是预期的行为吗?
  • 这不是预期的。在这里我只想要如果给定元组 (u,v) 并且如果存在元组 (v,u) 然后给它 true 否则 false 。所以第 8 行没有另一条反线。图例:u=origin 和 v = target
  • @aba2s 但是如果 (19, 19) 存在,那么 (19, 19) 肯定也存在 :P。无论哪种方式,我都更改了函数以在这些情况下返回 False。
猜你喜欢
  • 2016-06-24
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
  • 2021-12-12
  • 2021-10-18
  • 2020-04-22
  • 2010-09-23
  • 1970-01-01
相关资源
最近更新 更多