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

时间:2019-12-03 13:11:35

标签: python pandas dataframe

我有一个由事件日志组成的数据框,并按保存每个事件的时间排序。 日志/行对应于任务并具有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

2 个答案:

答案 0 :(得分:1)

假设time为时间戳。

df = df.join(df.groupby('ID')
               .time.min()
               .rename('time_min'), on='ID')
df.sort_values(['time_min', 'ID', 'time']).drop('time_min', axis=1)


  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

答案 1 :(得分:1)

使用GroupBy.transform解析新列的一个主意:

#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

ordered categoricals产生的另一种想法是由min的集合创建的,因此,如果使用DataFrame.sort_values则可以正确排序:

#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