如何在Python的Pandas中对每个组进行时间差计算。

10 浏览
0 Comments

如何在Python的Pandas中对每个组进行时间差计算。

以下是虚假数据:

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

有人能告诉我接下来该怎么做吗?非常感谢。

0
0 Comments

在使用Pandas和Python编写代码时,有一个问题是如何在每个组中计算时间差。下面是一个示例代码:

import pandas as pd
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())

这段代码的目的是计算每个电子邮件组中的时间差。输出结果如下:

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()

这样输出结果将包含电子邮件列:

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)`代码。这样索引也会更有意义。谢谢。

我们可以将索引(2、0、4、3)切换为对应的电子邮件列吗?谢谢。

嘿,还有一个问题,如果我去掉`inplace=True`并将两个提示连接在一起,结果是不正确的,为什么会这样?

因为在这种情况下,分组的值是针对未排序(原始)数据框的。

0