我有以下数据框:
Period group ID
20130101 A 10
20130101 A 20
20130301 A 20
20140101 A 20
20140301 A 30
20140401 A 40
20130101 B 11
20130201 B 21
20130401 B 31
20140401 B 41
20140501 B 51
我需要按照组别统计去年有多少不同的ID
。所以,我的期望输出应该像这样:
Period group num_ids_last_year
20130101 A 2 # ID 10 and 20 in the last year
20130301 A 2
20140101 A 2
20140301 A 2 # ID 30 enters, ID 10 leaves
20140401 A 3 # ID 40 enters
20130101 B 1
20130201 B 2
20130401 B 3
20140401 B 2 # ID 11 and 21 leave
20140501 B 2 # ID 31 leaves, ID 51 enters
Period是日期时间格式。我尝试了很多类似于以下的方法:
df.groupby(['group','Period'])['ID'].nunique() # Get number of IDs by group in a given period.
df.groupby(['group'])['ID'].nunique() # Get total number of IDs by group.
df.set_index('Period').groupby('group')['ID'].rolling(window=1, freq='Y').nunique()
但是最后一个甚至不可能。有没有什么简单直接的方法来做到这一点?我考虑可能需要结合 cumcount()
和 pd.DateOffset
, 或者可能需要使用 ge(df.Period - dt.timedelta(365)
,但是我找不到答案。
谢谢。
编辑:添加了在给定的 Period
中可以找到多个 ID
的事实。
20130101 B 1
被设置为1?难道不应该是2吗?如果不是,那么为什么这个逻辑不适用于2013年A组 -df.groupby([df['Period'].dt.year,'group'])['ID'].nunique()
? - Umar.H