gpt4 book ai didi

python - 如何计算数据框中一组分组行中前一个的差异

转载 作者:太空宇宙 更新时间:2023-11-03 13:00:58 25 4
gpt4 key购买 nike

我正在寻求有关 Pandas 中的同时分组/行对行差异问题的帮助。问题与 R 的此处所述完全相同:How to calculate time difference between datetimes, for each group (student-contract)?

我有这样的数据:

#   USER_ID CONTRACT_REF SUBMISSION_DATE  
1 1 A 20/6 01:00
2 1 A 20/6 02:00
3 1 B 20/6 03:00
4 4 A 20/6 04:00
5 5 A 20/6 05:00
6 5 B 20/6 06:00
7 7 A 20/6 07:00
8 7 B 20/6 08:00
9 7 B 20/6 09:30
10 7 B 20/6 10:00

我想为每个唯一的 USER_ID - CONTRACT_REF 对计算与上次提交的时间差。

注意:每个 USER_ID - CONTRACT_REF 对在第一次出现时必须有一个零(或空)。

所以输出应该如下所示:

#   USER_ID CONTRACT_REF SUBMISSION_DATE   TIME_DIFFERENCE
1 1 A 20/6 01:00 0
2 1 A 20/6 02:00 1
3 1 B 20/6 03:00 0
4 4 A 20/6 04:00 0
5 5 A 20/6 05:00 0
6 5 B 20/6 06:00 0
7 7 A 20/6 07:00 0
8 7 A 20/6 08:00 1
9 7 A 20/6 09:30 1.5
10 7 B 20/6 10:00 0

我目前正从 R 转向 Pandas,虽然我发现语法令人耳目一新,但当涉及到数据帧上的复杂函数时,我有点困惑。

提前感谢您的任何提示!

最佳答案

[注意:您的数据似乎与您想要的输出不匹配;没有 CONTRACT_REF C s 在第二个,甚至在你的输出中,我不明白为什么 5, B行是 1 而不是 0。我假设这些是你的错误。由于您没有发表评论,我将使用输出中的数据,因为它会导致一个更有趣的专栏。]

我可能会做类似的事情

df["SUBMISSION_DATE"] = pd.to_datetime(df["SUBMISSION_DATE"],dayfirst=True)

gs = df.groupby(["USER_ID", "CONTRACT_REF"])["SUBMISSION_DATE"]
df["TIME_DIFF"] = gs.diff().fillna(0) / pd.datetools.timedelta(hours=1)

产生

>>> df
# USER_ID CONTRACT_REF SUBMISSION_DATE TIME_DIFF
0 1 1 A 2014-06-20 01:00:00 0.0
1 2 1 A 2014-06-20 02:00:00 1.0
2 3 1 B 2014-06-20 03:00:00 0.0
3 4 4 A 2014-06-20 04:00:00 0.0
4 5 5 A 2014-06-20 05:00:00 0.0
5 6 5 B 2014-06-20 06:00:00 0.0
6 7 7 A 2014-06-20 07:00:00 0.0
7 8 7 A 2014-06-20 08:00:00 1.0
8 9 7 A 2014-06-20 09:30:00 1.5
9 10 7 B 2014-06-20 10:00:00 0.0

[10 rows x 5 columns]

一些解释:从像这样的数据框开始

>>> df
# USER_ID CONTRACT_REF SUBMISSION_DATE
0 1 1 A 20/6 01:00
1 2 1 A 20/6 02:00
2 3 1 B 20/6 03:00
3 4 4 A 20/6 04:00
4 5 5 A 20/6 05:00
5 6 5 B 20/6 06:00
6 7 7 A 20/6 07:00
7 8 7 A 20/6 08:00
8 9 7 A 20/6 09:30
9 10 7 B 20/6 10:00

[10 rows x 4 columns]

我们想把 SUBMISSION_DATE从字符串到真实日期对象的列:

>>> df["SUBMISSION_DATE"] = pd.to_datetime(df["SUBMISSION_DATE"],dayfirst=True)
>>> df
# USER_ID CONTRACT_REF SUBMISSION_DATE
0 1 1 A 2014-06-20 01:00:00
1 2 1 A 2014-06-20 02:00:00
2 3 1 B 2014-06-20 03:00:00
3 4 4 A 2014-06-20 04:00:00
4 5 5 A 2014-06-20 05:00:00
5 6 5 B 2014-06-20 06:00:00
6 7 7 A 2014-06-20 07:00:00
7 8 7 A 2014-06-20 08:00:00
8 9 7 A 2014-06-20 09:30:00
9 10 7 B 2014-06-20 10:00:00

[10 rows x 4 columns]

然后我们可以按USER_ID分组和 CONTRACT_REF , 然后选择 SUBMISSION_DATE专栏:

>>> gs = df.groupby(["USER_ID", "CONTRACT_REF"])["SUBMISSION_DATE"]
>>> gs
<pandas.core.groupby.SeriesGroupBy object at 0xa7af08c>

然后我们可以取每组的差异:

>>> gs.diff()
0 NaT
1 01:00:00
2 NaT
3 NaT
4 NaT
5 NaT
6 NaT
7 01:00:00
8 01:30:00
9 NaT
dtype: timedelta64[ns]

NaT , 非时间,是 NaN 的时间等价物.我们可以用 0 填充这些:

>>> gs.diff().fillna(0)
0 00:00:00
1 01:00:00
2 00:00:00
3 00:00:00
4 00:00:00
5 00:00:00
6 00:00:00
7 01:00:00
8 01:30:00
9 00:00:00
dtype: timedelta64[ns]

由于您希望以小时为单位衡量事物,我们可以除以 1 小时的时间增量:

>>> gs.diff().fillna(0) / pd.datetools.timedelta(hours=1)
0 0.0
1 1.0
2 0.0
3 0.0
4 0.0
5 0.0
6 0.0
7 1.0
8 1.5
9 0.0
dtype: float64

将其分配给框架:

>>> df["TIME_DIFF"] = gs.diff().fillna(0) / pd.datetools.timedelta(hours=1)

我们完成了:

>>> df
# USER_ID CONTRACT_REF SUBMISSION_DATE TIME_DIFF
0 1 1 A 2014-06-20 01:00:00 0.0
1 2 1 A 2014-06-20 02:00:00 1.0
2 3 1 B 2014-06-20 03:00:00 0.0
3 4 4 A 2014-06-20 04:00:00 0.0
4 5 5 A 2014-06-20 05:00:00 0.0
5 6 5 B 2014-06-20 06:00:00 0.0
6 7 7 A 2014-06-20 07:00:00 0.0
7 8 7 A 2014-06-20 08:00:00 1.0
8 9 7 A 2014-06-20 09:30:00 1.5
9 10 7 B 2014-06-20 10:00:00 0.0

[10 rows x 5 columns]

关于python - 如何计算数据框中一组分组行中前一个的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21501074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com