【问题标题】:Pandas select only the first 3 YYYYMM per groupPandas 每组只选择前 3 个 YYYYMM
【发布时间】:2020-07-12 12:46:41
【问题描述】:

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

谢谢

【问题讨论】:

  • 我不明白为什么不选择B 200008MMMMYY 看起来也不是有效的日期格式。
  • 未选中,因为对于 B,它将是从 200001 年开始的前三个月。 MMMMYY 我在当月的第一个日期转换为日期时间,否则当 a 的第一个值时我会遇到问题USR 是 200011 或 200012 * 为了清楚起见,在问题中添加了连续。我的坏

标签: python pandas dataframe time-series


【解决方案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

【讨论】:

  • 这里是日期时间
  • @gizq 你做print(df.MMMMYY.dtype)会得到什么?
  • 我得到一个 int64,但我必须转换为日期时间,或者对于像 usr F MMMYY 200011 这样开始的系列,我会遇到 200101 的问题
  • 谢谢monthOffset,比较完美谢谢!
猜你喜欢
  • 2014-01-08
  • 2016-12-08
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
  • 2015-02-09
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
相关资源
最近更新 更多