下午好,
我有像下面这样的弹药
+---+---+--------+
| |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']为true时,它将连续获取,但是在某些情况下,我可能只需要获取200001和200003,它们之间就不连续了。任何指导将不胜感激
谢谢
答案 0 :(得分:1)
您的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