【问题标题】:How to do time diff in each group on Pandas in Python如何在 Python 中对 Pandas 的每个组进行时间差异
【发布时间】:2016-11-27 20:25:28
【问题描述】:

这是虚假数据:

df = pd.DataFrame({'email': ['u1','u1','u1','u2','u2','u2'],
              'timestamp': [3, 1, 5, 11, 15, 9]})

我打算检索的是每组电子邮件中的时间差异。因此,在每组中按时间戳排序后,数据应该是:

u1  5
u1  3
u1  1
u2  15
u2  11
u2  9

结果应该是:

u1  2  # 5-3
u1  2  # 3-1
u2  4  # 15-11
u2  2  # 11-9

谁能告诉我下一步该怎么做?非常感谢。

【问题讨论】:

    标签: python pandas group-by


    【解决方案1】:
    df = pd.DataFrame({'email': ['u1','u1','u1','u2','u2','u2'],
                       'timestamp': [3, 1, 5, 11, 15, 9]})
    
    (df.sort_values(['email', 'timestamp'], ascending=[True, False])
     .groupby('email')['timestamp']
     .diff(-1)
     .dropna())
    Out: 
    2    2.0
    0    2.0
    4    4.0
    3    2.0
    Name: timestamp, dtype: float64
    

    保留电子邮件栏:

    df.sort_values(['email', 'timestamp'], ascending=[True, False], inplace=True)
    df.assign(diff=df.groupby('email')['timestamp'].diff(-1)).dropna()
    Out: 
      email  timestamp  diff
    2    u1          5   2.0
    0    u1          3   2.0
    4    u2         15   4.0
    3    u2         11   2.0
    

    如果您不想要时间戳列,可以在末尾添加.drop('timestamp', axis=1)

    【讨论】:

    • @MaxU 该索引也更有意义。谢谢。
    • 能否将索引(2、0、4、3)切换到上一个对应的email列?谢谢
    • 你好,再问一个问题,如果我把inplace=True去掉,把两个提示连接起来,结果不正确,这是为什么呢?
    • 因为在这种情况下,分组值用于未排序的(原始)数据帧。
    猜你喜欢
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多