在数据框中的列之间查找一个 - 多个匹配项

时间:2021-03-21 14:01:05

标签: python pandas dataframe

我有一个如下所示的数据框。 enter image description here

它有 189437 行和 2 列。我需要做的是找出有多少个 Num 关联了一个以上的 ID(即相同的 Num 但不同的 ID)以及反之亦然(相同的 ID 但不同的 Num )。我需要从整体中得到多少行有这种数据。我该怎么做?

1 个答案:

答案 0 :(得分:0)

您可以为此使用 groupby。 查找不同 ID 的 Num 数量:

groups = df.groupby("Num").apply(lambda x: len(set(x["ID"])))
result = sum(groups > 1)

反之:

groups = df.groupby("ID").apply(lambda x: len(set(x["Num"])))
result = sum(groups > 1)

Edit 1:正如@Grzegorz Skibinski 在评论中提出的,nunique() 可能更简洁,所以:

result = sum(df.groupby("Num")["ID"].nunique() > 1)

编辑 2:基准

我用 2 列(整数和 str)创建了数据框

import pandas as pd
import numpy as np
import random
import string

df = pd.DataFrame({
    "col1": np.random.randint(0, 100, 1000_000),
    "col2": ["".join(random.sample(string.ascii_lowercase[:5], 3)) for _ in range(1000_000)]
})

依靠 str 列:nunique() 胜过 len(set())。 然而,依靠 int 列:len(set()) 胜过 nunique()

%%timeit -n 10
df.groupby("col1").apply(lambda x: len(set(x["col2"])))
# output: 10 loops, best of 5: 467 ms per loop

%%timeit -n 10
df.groupby("col1")["col2"].nunique()
# output: 10 loops, best of 5: 296 ms per loop

%%timeit -n 10
df.groupby("col2").apply(lambda x: len(set(x["col1"])))
# output: 10 loops, best of 5: 286 ms per loop

%%timeit -n 10
df.groupby("col2")["col1"].nunique()
# output: 10 loops, best of 5: 306 ms per loop
相关问题