我有一个数据数据帧,我想在其中添加一列,该列将分别指示每个user_id的日期顺序,因此就像表2所示。
TABLE1:
user_id received_at action
0043e1a6-52e4 2018-01-05 12:32:10 A
2018-01-05 12:33:13 A
2018-01-05 12:42:12 B
0070f782-29f4 2018-01-06 01:41:18 A
2018-01-06 01:42:12 A
2018-01-06 01:43:11 B
2018-01-06 01:44:18 C
008aa58a-84a5 2018-01-06 14:22:13 A
2018-01-06 14:23:18 A
2018-01-06 14:24:13 A
2018-01-06 14:25:18 C
像这样
TABLE2:
user_id received_at action order_n
0043e1a6-52e4 2018-01-05 12:32:10 A 1
2018-01-05 12:33:13 A 2
2018-01-05 12:42:12 B 3
0070f782-29f4 2018-01-06 01:41:18 A 1
2018-01-06 01:42:12 A 2
2018-01-06 01:43:11 B 3
2018-01-06 01:44:18 C 4
008aa58a-84a5 2018-01-06 14:22:13 A 1
2018-01-06 14:23:18 A 2
2018-01-06 14:24:13 A 3
2018-01-06 14:25:18 C 4
是否有比分别对每个user_id进行迭代更有效,更简单的解决方案?
答案 0 :(得分:0)
groupby user_id
并使用rank
received_at
df['count_n'] = df.groupby('user_id').received_at.apply(pd.Series.rank)
这不需要排序步骤,即使数据帧没有在每个组中按received_at
进行排序,
如果将列user_id
设置为索引(如样本数据似乎所示),则可以替代使用以下内容。尽管在最新版本的熊猫中,按命名索引进行分组也可以(即上述方法可能也可以)
df.groupby(level=0).received_at.apply(pd.Series.rank)