Python 按时间戳排序数据帧,同时保持与连续行相同的id

Python 按时间戳排序数据帧,同时保持与连续行相同的id,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个由eventlog组成的数据框架,并按保存每个事件的时间排序。 日志/行对应于任务,并且有一个ID,我想将事件/行从相同的第一个ID(该ID的第一个事件/时间戳)移动到第一个ID下 我尝试了对两列进行简单的pd.sort_value(),但没有得到想要的结果 最终的结果是 ID time X 01/01/2010 X 03/01/2010 X 04/01/2010 J 02/01/2010 J 03/01/2010 Y 03/01/2

我有一个由eventlog组成的数据框架,并按保存每个事件的时间排序。 日志/行对应于任务,并且有一个ID,我想将事件/行从相同的第一个ID(该ID的第一个事件/时间戳)移动到第一个ID下

我尝试了对两列进行简单的pd.sort_value(),但没有得到想要的结果

最终的结果是

ID    time
X     01/01/2010
X     03/01/2010
X     04/01/2010
J     02/01/2010
J     03/01/2010
Y     03/01/2010
Y     07/01/2010
Y     08/01/2010

假定
time
为时间戳

df=df.join(df.groupby('ID'))
.time.min()
.rename('time\u min'),on='ID')
df.sort_值(['time_min','ID','time'])。drop('time_min',axis=1)
身份证时间
0 X 2010-01-01
1x2010-03-01
2x2010-04-01
3 J 2010-02-01
4 J 2010-03-01
5 Y 2010-03-01
6 Y 2010-07-01
7 Y 2010-08-01

假设时间是时间戳

df=df.join(df.groupby('ID'))
.time.min()
.rename('time\u min'),on='ID')
df.sort_值(['time_min','ID','time'])。drop('time_min',axis=1)
身份证时间
0 X 2010-01-01
1x2010-03-01
2x2010-04-01
3 J 2010-02-01
4 J 2010-03-01
5 Y 2010-03-01
6 Y 2010-07-01
7 Y 2010-08-01
一个用于解析的新列的想法:

#if need first value per log change 'min' to 'first'
df = (df.assign(new = df.groupby('ID')['time'].transform('min'))
        .sort_values(['new', 'ID', 'time'])
        .drop('new', 1))
print (df)

  ID       time
0  X 2010-01-01
1  X 2010-03-01
2  X 2010-04-01
3  J 2010-02-01
4  J 2010-03-01
5  Y 2010-03-01
6  Y 2010-07-01
7  Y 2010-08-01
另一个想法是由
min
的聚合创建的,因此如果正确使用它排序:

#if need first value change 'min' to 'first'
cats = df.groupby('ID')['time'].min().sort_values()

df['ID'] = pd.CategoricalIndex(df['ID'], categories=cats.index, ordered=True)

df = df.sort_values(['ID', 'time'])
print (df)
  ID       time
0  X 2010-01-01
1  X 2010-03-01
2  X 2010-04-01
3  J 2010-02-01
4  J 2010-03-01
5  Y 2010-03-01
6  Y 2010-07-01
7  Y 2010-08-01
对于用于解析的新列,有一个想法:

#if need first value per log change 'min' to 'first'
df = (df.assign(new = df.groupby('ID')['time'].transform('min'))
        .sort_values(['new', 'ID', 'time'])
        .drop('new', 1))
print (df)

  ID       time
0  X 2010-01-01
1  X 2010-03-01
2  X 2010-04-01
3  J 2010-02-01
4  J 2010-03-01
5  Y 2010-03-01
6  Y 2010-07-01
7  Y 2010-08-01
另一个想法是由
min
的聚合创建的,因此如果正确使用它排序:

#if need first value change 'min' to 'first'
cats = df.groupby('ID')['time'].min().sort_values()

df['ID'] = pd.CategoricalIndex(df['ID'], categories=cats.index, ordered=True)

df = df.sort_values(['ID', 'time'])
print (df)
  ID       time
0  X 2010-01-01
1  X 2010-03-01
2  X 2010-04-01
3  J 2010-02-01
4  J 2010-03-01
5  Y 2010-03-01
6  Y 2010-07-01
7  Y 2010-08-01