我有一个示例数据框架,如下所示
df=pd.DataFrame({'Adm DateTime':['02/25/2012 09:40:00','03/05/1996 09:41:00','11/12/2010 10:21:21','31/05/2012 04:21:31','21/07/2019 13:15:02','31/10/2020 08:21:00'],
's_id':[1,1,1,1,2,2],
't_id':['t1','t2','t3','t3','t4','t5']})
df['Adm DateTime'] = pd.to_datetime(df['Adm DateTime'])
我想为每个组(s_id)生成行号
我试过下面的
df['R_N'] = df.sort_values(['Adm DateTime'], ascending=True).groupby(['s_id']).cumcount() + 1
虽然这在样本数据中有效,但在原始数据中会抛出以下错误。
TypeError: '<'在'datetime.datetime'实例之间不支持和"str">
但是在我原来的Adm DateTime
列中没有NA
,列本身的数据类型是datetime64[ns]
。我不会显式地在日期之间执行任何比较(除了可能在内部完成的排序)
我可以知道为什么会发生这个错误,我如何识别导致这个问题的记录吗?
您可以尝试拆分解决方案,因为在您的解决方案中,如果链排序和创建新列熊猫必须通过原始索引在内部重新排序行,我想这应该是问题(输出没有排序行)。
df['R_N'] = (df.sort_values(['Adm DateTime'], ascending=True)
.groupby(['s_id']).cumcount() + 1)
print (df)
Adm DateTime s_id t_id R_N
0 2012-02-25 09:40:00 1 t1 3
1 1996-03-05 09:41:00 1 t2 1
2 2010-11-12 10:21:21 1 t3 2
3 2012-05-31 04:21:31 1 t3 4
4 2019-07-21 13:15:02 2 t4 1
5 2020-10-31 08:21:00 2 t5 2
如果需要这个输出,可能的想法应该是创建唯一的索引值:
df = df.reset_index(drop=True)
df['R_N'] = (df.sort_values(['Adm DateTime'], ascending=True)
.groupby(['s_id']).cumcount() + 1)
我的解决方案在排序后创建新的DataFrame
,因此不需要重新排序或行(并且输出已排序行)
df['Adm DateTime'] = pd.to_datetime(df['Adm DateTime'])
df = df.sort_values(['Adm DateTime'])
df['R_N'] = df.groupby(['s_id']).cumcount() + 1
print (df)
Adm DateTime s_id t_id R_N
1 1996-03-05 09:41:00 1 t2 1
2 2010-11-12 10:21:21 1 t3 2
0 2012-02-25 09:40:00 1 t1 3
3 2012-05-31 04:21:31 1 t3 4
4 2019-07-21 13:15:02 2 t4 1
5 2020-10-31 08:21:00 2 t5 2