检测 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
我有一个包含两列的数据框; 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