python - Pandas 每组只选择前 3 个 YYYYMM
问题描述
C下午好,
我有一个像下面这样的数据
+---+---+--------+
| |USR| MMMMYY |
+---+---+--------+
| 1 | A | 200002 |
+---+---+--------+
| 2 | A | 200003 |
+---+---+--------+
| 3 | A | 200004 |
+---+---+--------+
| 4 | A | 200005 |
+---+---+--------+
| 5 | B | 200001 |
+---+---+--------+
| 6 | B | 200003 |
+---+---+--------+
| 7 | B | 200008 |
+---+---+--------+
| 8 | B | 200009 |
+---+---+--------+
我只需要获得每个 USR 的前三个 *CONSECUTIVE MMMMYY。
+---+---+--------+
| |USR| MMMMYY |
+---+---+--------+
| 1 | A | 200002 |
+---+---+--------+
| 2 | A | 200003 |
+---+---+--------+
| 3 | A | 200004 |
+---+---+--------+
| 5 | B | 200001 |
+---+---+--------+
| 6 | B | 200003 |
+---+---+--------+
我能够使用 head(3) 获取前 3 条记录
df.sort_values(['USR', 'MMMMYY' ], ascending=[True, True]).groupby('USR', as_index=False).head(3)
但当然它不会带回我需要的东西,也不会使用
df['mm_dif']=df.groupby(['USR'])['MMMMYY'].diff()
df['mm_dif2']=df.groupby(['USR'])['MMMMYY'].diff(-1)
df['check']=np.where((df.mm_dif==1) | (df.mm_dif2==-1),True,False)
当 ['check'] 为真时,它会得到连续的,但在某些情况下,我可能只需要获得 200001 和 200003 并且它们之间不是连续的。任何指导将不胜感激
谢谢
解决方案
你MMMMYY
的是日期时间,然后datetime
先把它转成类型:
df['MMMMYY'] = pd.to_datetime(df.MMMMYY, format='%Y%m')
s = df.groupby('USR')['MMMMYY'].transform('min') + pd.offsets.MonthOffset(3)
df[df.MMMMYY<s]
输出:
USR MMMMYY
1 A 2000-02-01
2 A 2000-03-01
3 A 2000-04-01
5 B 2000-01-01
6 B 2000-03-01
推荐阅读
- vue.js - 使用 Vuetify 创建动态游戏板?
- android - 如果选择了另一个项目,我如何取消选择一个项目?
- javascript - Node.js Sequelize ORM 错误与 sourceKey 在多对多关系
- python - 当在其中一个字符串中插入空格时匹配两个字符串中的元素
- javascript - 使用 Easy Peasy TypeError 做出反应:注册 [1] 未定义
- javascript - 我想使用 JavaScript 或 C# 下载 API 响应(JSON 文件格式)
- vlc - VLC 媒体播放器中的时间跳过
- r - 如何对嵌套数据框中的数字列求和?
- android-studio - 在windows10中卸载后是否可以重新安装android studio
- python - 在python中使用等效的django regroup标签