我需要根据每个人的id(name
(和登录时间(login_time
(来计算数据集中经过的时间。我想看看这个df:中列出的每个人从第一个login_time
到最后一个login_time
之间经过的时间
数据示例:
name login_time
alex 2020-12-18T10:50:35
alex 2020-12-19T11:50:11
sue 2020-10-15T10:00:35
sue 2020-10-16T09:50:22
不幸的是,实际的数据集有超过800000行。如果它只是样本数据,我会这样做:
df = pd.read_csv('filepathto.csv')
df.apply(lambda x: x[x['name'] == 'alex'].login_time.max()
) - df.apply(lambda x: x[x['name'] == 'alex'].login_time.min()) #repeat for sue
我的问题是,我该如何扩展它,或者有没有更好的方法来获得我想要的结果(从第一次记录到最后一次记录的经过时间(?
编辑:DF有27列,而不仅仅是2列。列出的两个正是我对这个过程感兴趣的地方。
假设df
的索引是name
列。我会使用以下方法:
df.groupby('name').max() - df.groupby('name').min()
因为df
中只有2列,所以df.groupby('name')
的组值将是login_time
列中的值。
CCD_ 10是除CCD_ 11之外的唯一列。
如果df
中有2列以上,请使用以下代码指定login_time
列:
df.groupby('name')['login_time'].max() - df.groupby('name')['login_time'].min()
使用GroupBy.agg
减去Series.sub
:
df['login_time'] = pd.to_datetime(df['login_time'])
df1 = df.groupby('name')['login_time'].agg(['min','max'])
print (df1)
min max
name
alex 2020-12-18 10:50:35 2020-12-19 11:50:11
sue 2020-10-15 10:00:35 2020-10-16 09:50:22
df2 = df1['max'].sub(df1['min']).reset_index(name='diff')
print (df2)
name diff
0 alex 1 days 00:59:36
1 sue 0 days 23:49:47
或者如果性能不重要:
df2 = (df.groupby('name')['login_time']
.agg(lambda x: x.max() - x.min())
.reset_index(name='diff'))