【发布时间】:2020-01-22 14:09:02
【问题描述】:
所以我有以下数据框:
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
我需要计算去年group 有多少不同的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
期间为日期时间格式。我尝试了很多事情:
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
【问题讨论】:
-
滚动窗口需要一个固定窗口。 “M”和“Y”(由于闰年)都不是固定频率。在这个答案中,我解释了如何“规范化”您的时间序列以允许一个月的滚动窗口:stackoverflow.com/questions/59569963/…
-
为什么
20130101 B 1设置为 1 ?不应该是 2 吗?如果不是,那么为什么该逻辑不适用于 2013 年 A 组 -df.groupby([df['Period'].dt.year,'group'])['ID'].nunique() -
因为在
20130101组 B 中,只有 1 个ID:11。在这种情况下,我正在计算从 20120101 到 20130101 有多少个 ID。我计算的是从今天开始的 1 年窗口,按组有多少个不同的 ID