我有一个如下所示的数据框。 enter image description here
它有 189437 行和 2 列。我需要做的是找出有多少个 Num 关联了一个以上的 ID(即相同的 Num 但不同的 ID)以及反之亦然(相同的 ID 但不同的 Num )。我需要从整体中得到多少行有这种数据。我该怎么做?
答案 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