gpt4 book ai didi

python - 在 Pandas 中分组时如何计算列组合中的不同值?

转载 作者:太空狗 更新时间:2023-10-29 22:10:36 26 4
gpt4 key购买 nike

我有一个 Pandas 数据框。我想通过使用一种列组合对其进行分组,并计算另一种列组合的不同值。

例如我有以下数据框:

   a   b    c     d      e
0 1 10 100 1000 10000
1 1 10 100 1000 20000
2 1 20 100 1000 20000
3 1 20 100 2000 20000

我可以按 ab 列对其进行分组,并计算 d 列中的 distinct 值:

df.groupby(['a','b'])['d'].nunique().reset_index()

结果我得到:

   a   b  d
0 1 10 1
1 1 20 2

但是,我想计算列组合中的不同值。例如,如果我使用 cd,那么在第一组中我只有一个唯一的组合 ((100, 1000)) 而在第二组我有两个不同的组合:(100, 1000)(100, 2000)

以下天真的“概括”不起作用:

df.groupby(['a','b'])[['c','d']].nunique().reset_index()

因为nunique()不适用于数据框。

最佳答案

您可以创建转换为 string 的值组合到新列 e,然后使用 SeriesGroupBy.nunique :

df['e'] = df.c.astype(str) + df.d.astype(str)
df = df.groupby(['a','b'])['e'].nunique().reset_index()
print (df)
a b e
0 1 10 1
1 1 20 2

您也可以在不创建新列的情况下使用 Series:

df =(df.c.astype(str)+df.d.astype(str)).groupby([df.a, df.b]).nunique().reset_index(name='f')
print (df)
a b f
0 1 10 1
1 1 20 2

另一种可能的解决方案是创建元组:

df=(df[['c','d']].apply(tuple, axis=1)).groupby([df.a, df.b]).nunique().reset_index(name='f')
print (df)
a b f
0 1 10 1
1 1 20 2

这个 answer 的另一个 numpy 解决方案:

def f(x):
a = x.values
c = len(np.unique(np.ascontiguousarray(a).view(np.dtype((np.void, a.dtype.itemsize * a.shape[1]))), return_counts=True)[1])
return c

print (df.groupby(['a','b'])[['c','d']].apply(f))

时间:

#[1000000 rows x 5 columns]
np.random.seed(123)
N = 1000000
df = pd.DataFrame(np.random.randint(30, size=(N,5)))
df.columns = list('abcde')
print (df)

In [354]: %timeit (df.groupby(['a','b'])[['c','d']].apply(lambda g: len(g) - g.duplicated().sum()))
1 loop, best of 3: 663 ms per loop

In [355]: %timeit (df.groupby(['a','b'])[['c','d']].apply(f))
1 loop, best of 3: 387 ms per loop

In [356]: %timeit (df.groupby(['a', 'b', 'c', 'd']).size().groupby(level=['a', 'b']).size())
1 loop, best of 3: 441 ms per loop

In [357]: %timeit ((df.c.astype(str)+df.d.astype(str)).groupby([df.a, df.b]).nunique())
1 loop, best of 3: 4.95 s per loop

In [358]: %timeit ((df[['c','d']].apply(tuple, axis=1)).groupby([df.a, df.b]).nunique())
1 loop, best of 3: 17.6 s per loop

关于python - 在 Pandas 中分组时如何计算列组合中的不同值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40805769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com