首页 > 解决方案 > 在 pandas 中按组返回最长连续月份的长度

问题描述

df

    id  date
0   a   202007
1   a   202008
2   a   202009
3   a   202010
4   a   202011
5   b   202011
6   c   202011
7   c   202012
8   c   202101
9   c   202102
10  d   202101
11  d   202102
12  d   202103
13  d   202105
14  e   202012
15  e   202101
16  e   202102
17  e   202104
18  e   202105
14  f   202012
15  f   202101
16  f   202103
17  f   202104
18  f   202105

第二列类型是 int。

预期的

a  5
b  1
c  4
d  3
e  3
f  3

尝试和参考

我参考了上面的帖子,但仍然可以获得结果。

注意:对于每个 id,date 的值都是唯一的。

熊猫版本:1.1.5

标签: pandas

解决方案


将日期时间转换为月份周期Series.dt.to_period,然后转换为整数,然后transform使用GroupBy.size每个max第一级,这里id

per = pd.to_datetime(df['date'], format='%Y%m').dt.to_period('m').astype('int')
g = per.diff(-1).ne(-1).shift().bfill().cumsum()

df = df.groupby(['id',g]).size().max(level=0).reset_index(name='count')
print (df)
  id  count
0  a      5
1  b      1
2  c      4
3  d      3
4  e      3
5  f      3

对于较旧的熊猫版本,如果没有缺失值,则可以通过自定义函数n从以下获​​取属性:MonthEnd objectdiff

f = lambda x: x.n if pd.notna(x) else None
df['date'] = pd.to_datetime(df['date'], format='%Y%m').dt.to_period('m')
g = df['date'].diff(-1).apply(f).ne(-1).shift().bfill().cumsum()

df = df.groupby(['id',g]).size().max(level=0).reset_index(name='count')
print (df)
  id  count
0  a      5
1  b      1
2  c      4
3  d      3
4  e      3
5  f      3

推荐阅读