我想对数据集进行分组并返回最大和最小时间戳。这是我的数据
id timestamp
1 2017-09-17 10:09:01
2 2017-10-02 01:13:15
1 2017-09-17 10:53:07
1 2017-09-17 10:52:18
2 2017-09-12 21:59:40
这是我想要的输出
id max min
1 2017-09-17 10:53:07 2017-09-17 10:09:01
2 2017-10-02 01:13:15 2017-09-12 21:59:40
在这里,我做了什么,代码效率似乎不高,我希望在熊猫上做更好的方法
data1 = df.sort_values('timestamp').drop_duplicates(['customer_id'], keep='last')
data2 = df.sort_values('timestamp').drop_duplicates(['customer_id'], keep='first')
data1['max'] = data1['timestamp']
data2['min'] = data2['timestamp']
data = data1.merge(data2, on = 'customer_id', how='left')
data = data.drop(['timestamp_x','timestamp_y'], axis=1)
似乎熊猫有这种类型的支点
答案 0 :(得分:5)
我认为需要agg
:
df = df.groupby('id')['timestamp'].agg(['min','max']).reset_index()
print (df)
id min max
0 1 2017-09-17 10:09:01 2017-09-17 10:53:07
1 2 2017-09-12 21:59:40 2017-10-02 01:13:15
或者稍微修改一下你的解决方案(应该更快):
data = df.sort_values('timestamp')
data1 = data.drop_duplicates(['id'], keep='last').set_index('id')
data2 = data.drop_duplicates(['id'], keep='first').set_index('id')
df = pd.concat([data1['timestamp'], data2['timestamp']],keys=('max','min'), axis=1)
print (df)
max min
id
1 2017-09-17 10:53:07 2017-09-17 10:09:01
2 2017-10-02 01:13:15 2017-09-12 21:59:40