Pandas只选择每组的前3个YYYYMM

2024-09-26 22:08:43 发布

您现在位置:Python中文网/ 问答频道 /正文

下午好

我有一个像下面这样的数据框

+---+---+--------+
|   |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的前三个*连续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,并且它们之间不是连续的。任何指导都将不胜感激

谢谢


Tags: 数据falsetruedfusrcheck记录diff
1条回答
网友
1楼 · 发布于 2024-09-26 22:08:43

您的MMMMYY是datetime,然后首先将其转换为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

相关问题 更多 >

    热门问题