繁体   English   中英

如何按组计算累积唯一值?

[英]How to count cumulative unique values by group?

我想知道如何按组计算 python 中的累积唯一值?

下面是 dataframe 示例:

团体 类型
一个 1998 红色的
一个 1998 蓝色的
一个 2002年 红色的
一个 2005年 蓝色的
一个 2008年 蓝色的
一个 2008年
1998 红色的
2001年 红色的
2003年 红色的
C 1996 红色的
C 2002年
C 2002年 红色的
C 2012 蓝色的
C 2012

我需要按“组”列创建一个新列。 这个新列的值应该是列“类型”的累积唯一值,按列“年”累积。

下面是我想要的dataframe。 例如: (1)对于A组和1998年,我想统计1998年Type的唯一值,Type有两个唯一值:红色和蓝色。 (2)对于A组和2002年,我想统计1998年和2002年Type的唯一值,Type也有两个唯一值:红色和蓝色。 (3)对于A组和2008年,我想统计1998年、2002年、2005年和2008年Type的唯一值,Type的唯一值有红色、蓝色和黄色三个。

团体 类型
一个 1998 红色的 2
一个 1998 蓝色的 2
一个 2002年 红色的 2
一个 2005年 蓝色的 2
一个 2008年 蓝色的 3
一个 2008年 3
1998 红色的 1
2001年 红色的 1
2003年 红色的 1
C 1996 红色的 1
C 2002年 2
C 2002年 红色的 2
C 2012 蓝色的 4
C 2012 4

关于此 dataframe 的另一件事:并非所有组在同一年份都有值。 例如,A 组在 1998 年和 2008 年有两个值,在 2002 年和 2005 年有一个值。B 组在 1998、2001 和 2003 年有值。

我想知道如何解决这个问题。 您的大力帮助对我来说意义重大。 谢谢!

对于每个Group

Append 新列Want具有您想要的值:

def f(df):
    want = df.groupby('Year')['Type'].agg(list).cumsum().apply(set).apply(len)
    want.name = 'Want'
    return df.merge(want, on='Year')

df.groupby('Group', group_keys=False).apply(f).reset_index(drop=True)

结果:

   Group  Year    Type  Want
0      A  1998     red     2
1      A  1998    blue     2
2      A  2002     red     2
3      A  2005    blue     2
4      A  2008    blue     3
5      A  2008   yello     3
6      B  1998     red     1
7      B  2001     red     1
8      B  2003     red     1
9      C  1996     red     1
10     C  2002  orange     2
11     C  2002     red     2
12     C  2012    blue     4
13     C  2012   yello     4

笔记:

  • 我认为在这里使用.merge是有效的。

  • 您还可以在f中使用 1 个.apply而不是 2 个链式来提高效率: .apply(lambda x: len(set(x)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM