在Python中使用groupby计算平均差异
我是Python新手,我想在我的第一列中聚合(groupby)ID。 第二列中的值是时间戳(datetime格式),通过聚合ID,我希望获得聚合ID列中每个ID的时间戳(以天为单位)之间的平均差异。我的表格看起来像是在Python中使用groupby计算平均差异,python,pandas,datetime,pandas-groupby,timedelta,Python,Pandas,Datetime,Pandas Groupby,Timedelta,我是Python新手,我想在我的第一列中聚合(groupby)ID。 第二列中的值是时间戳(datetime格式),通过聚合ID,我希望获得聚合ID列中每个ID的时间戳(以天为单位)之间的平均差异。我的表格看起来像是df1,我想要的是df2,但由于我是一个绝对的初学者,我不知道如何做到这一点 import pandas as pd import numpy as np from datetime import datetime In[1]: # df1 ID = np.array([1,1,1
df1
,我想要的是df2
,但由于我是一个绝对的初学者,我不知道如何做到这一点
import pandas as pd
import numpy as np
from datetime import datetime
In[1]:
# df1
ID = np.array([1,1,1,2,2,3])
Timestamp = np.array([
datetime.strptime('2018-01-01 18:07:02', "%Y-%m-%d %H:%M:%S"),
datetime.strptime('2018-01-08 18:07:02', "%Y-%m-%d %H:%M:%S"),
datetime.strptime('2018-03-15 18:07:02', "%Y-%m-%d %H:%M:%S"),
datetime.strptime('2018-01-01 18:07:02', "%Y-%m-%d %H:%M:%S"),
datetime.strptime('2018-02-01 18:07:02', "%Y-%m-%d %H:%M:%S"),
datetime.strptime('2018-01-01 18:07:02', "%Y-%m-%d %H:%M:%S")])
df = pd.DataFrame({'ID': ID, 'Timestamp': Timestamp})
Out[1]:
ID Timestamp
0 1 2018-01-01 18:07:02
1 1 2018-01-08 18:07:02
2 1 2018-03-15 18:07:02
3 2 2018-01-01 18:07:02
4 2 2018-02-01 18:07:02
5 3 2018-01-01 18:07:02
In[2]:
#df2
ID = np.array([1,2,3])
Avg_Difference = np.array([7, 1, "nan"])
df2 = pd.DataFrame({'ID': ID, 'Avg_Difference': Avg_Difference})
Out[2]:
ID Avg_Difference
0 1 7
1 2 1
2 3 nan
你可以这样做:
df.groupby('ID')['Timestamp'].apply(lambda x: x.diff().mean())
在您的情况下,它看起来像:
>>> df
ID Timestamp
0 1 2018-01-01 18:07:02
1 1 2018-01-08 18:07:02
2 1 2018-03-15 18:07:02
3 2 2018-01-01 18:07:02
4 2 2018-02-01 18:07:02
5 3 2018-01-01 18:07:02
>>> df.groupby('ID')['Timestamp'].apply(lambda x: x.diff().mean())
ID
1 36 days 12:00:00
2 31 days 00:00:00
3 NaT
Name: Timestamp, dtype: timedelta64[ns]
如果您希望它作为一个数据帧,列名为Avg_Difference
,只需在末尾将添加到_frame
:
df.groupby('ID')['Timestamp'].apply(lambda x: x.diff().mean()).to_frame('Avg_Difference')
Avg_Difference
ID
1 36 days 12:00:00
2 31 days 00:00:00
3 NaT
编辑根据您的评论,如果要删除时间元素,只需获取天数,可以执行以下操作:
df.groupby('ID')['Timestamp'].apply(lambda x: x.diff().mean()).dt.days.to_frame('Avg_Difference')
Avg_Difference
ID
1 36.0
2 31.0
3 NaN
效果非常好,除了我得到(由于mean()函数)有时是毫秒/微秒(37天03:55:34.500000),有时不是(27天15:56:25)。如何删除毫秒/微秒,或在没有毫秒/微秒的情况下添加.000000?非常感谢。查看我的编辑,您只需致电
dt.days
即可获得完整的daysWorks数-谢谢!还有一件事(如果你不介意的话)-我如何将我的(聚合)ID保留为一列(或者是聚合索引,因为在我的例子中index=ID)?我不太确定你到底想要什么,但请尝试在最后链接。reset_index()