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