【问题标题】:Calculating average differences with groupby in Python在 Python 中使用 groupby 计算平均差异
【发布时间】:2018-12-15 21:52:35
【问题描述】:

我是 Python 新手,我想在我的第一列中聚合 (groupby) ID。 第二列中的值是时间戳(日期时间格式),通过聚合 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,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

【问题讨论】:

    标签: python pandas datetime pandas-groupby timedelta


    【解决方案1】:

    你可以这样做:

    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,只需在末尾添加 to_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 获取天数
    • 完美运行 - 谢谢!还有一件事(如果您不介意的话) - 我怎样才能将我的(聚合)ID 保留为一列(或者聚合索引,因为在我的情况下 index = ID)?
    • 我不太确定你想要什么,但请尝试在最后链接 .reset_index()
    猜你喜欢
    • 1970-01-01
    • 2015-07-03
    • 2017-03-20
    • 2020-09-26
    • 2020-05-13
    • 1970-01-01
    • 2020-07-27
    • 2013-02-07
    • 2016-09-12
    相关资源
    最近更新 更多