[英]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.