pandas - 在 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
解决方案
将日期时间转换为月份周期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 object
diff
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
推荐阅读
- php - 通过functions.php将Wordpress用户的默认显示名称设置为'firstname + lastname'
- java - 在设置 @Trace(dispatcher=true) 注释之前设置自定义参数
- javascript - 我如何测试 nodejs module.exports 功能?
- javascript - entity.components 是否返回一个数组?
- python - 从调用其他模块的python文件导入模块
- swift - 如何使用 Combine 遍历发布者的输出?
- python-3.x - Python & BS4 分页循环
- python - 使用 pyinstaller 转换为 .exe 后退出 pygame 窗口且未打开控制台时“无法执行脚本 myscript”
- java - 可以向 void 方法添加返回参数会破坏现有功能吗?
- javascript - 如何上传带有某些字段的图像?