【问题标题】:add timedelta data within a group in pandas dataframe在 pandas 数据框中的组内添加 timedelta 数据
【发布时间】:2016-08-06 15:13:54
【问题描述】:

我正在处理带有四列 user_idtime_stamp1time_stamp2interval 的 pandas 数据框。 Time_stamp1 和 time_stamp2 的类型为 datetime64[ns],interval 的类型为 timedelta64[ns]。

我想总结数据框中每个 user_id 的间隔值,并尝试以多种方式计算它:

1)df["duration"]=   df.groupby('user_id')['interval'].apply (lambda x: x.sum())

2)df ["duration"]=  df.groupby('user_id').aggregate (np.sum)

3)df ["duration"]=  df.groupby('user_id').agg (np.sum)

但它们都不起作用,运行代码后duration 的值将是NaT

【问题讨论】:

  • df.groupby('user_id')['interval'].sum()df.groupby('user_id')['interval'].agg('sum') 怎么样?
  • 这两个我也查了,但是duration列的结果是Nat
  • 你能发布一些示例数据集吗?
  • 你从来没有提到user_idtype。如果是float64 类型,你一定会得到NaT 值。

标签: python pandas dataframe group-by timedelta


【解决方案1】:

更新:你可以使用transform()方法:

In [291]: df['duration'] = df.groupby('user_id')['interval'].transform('sum')

In [292]: df
Out[292]:
                    a  user_id                   b          interval           duration
0 2016-01-01 00:00:00     0.01 2015-11-11 00:00:00  51 days 00:00:00  838 days 08:00:00
1 2016-03-10 10:39:00     0.01 2015-12-08 18:39:00               NaT  838 days 08:00:00
2 2016-05-18 21:18:00     0.01 2016-01-05 13:18:00 134 days 08:00:00  838 days 08:00:00
3 2016-07-27 07:57:00     0.01 2016-02-02 07:57:00 176 days 00:00:00  838 days 08:00:00
4 2016-10-04 18:36:00     0.01 2016-03-01 02:36:00 217 days 16:00:00  838 days 08:00:00
5 2016-12-13 05:15:00     0.01 2016-03-28 21:15:00 259 days 08:00:00  838 days 08:00:00
6 2017-02-20 15:54:00     0.02 2016-04-25 15:54:00 301 days 00:00:00 1454 days 00:00:00
7 2017-05-01 02:33:00     0.02 2016-05-23 10:33:00 342 days 16:00:00 1454 days 00:00:00
8 2017-07-09 13:12:00     0.02 2016-06-20 05:12:00 384 days 08:00:00 1454 days 00:00:00
9 2017-09-16 23:51:00     0.02 2016-07-17 23:51:00 426 days 00:00:00 1454 days 00:00:00

旧答案:

演示:

In [260]: df
Out[260]:
                    a                   b          interval  user_id
0 2016-01-01 00:00:00 2015-11-11 00:00:00  51 days 00:00:00        1
1 2016-03-10 10:39:00 2015-12-08 18:39:00               NaT        1
2 2016-05-18 21:18:00 2016-01-05 13:18:00 134 days 08:00:00        1
3 2016-07-27 07:57:00 2016-02-02 07:57:00 176 days 00:00:00        1
4 2016-10-04 18:36:00 2016-03-01 02:36:00 217 days 16:00:00        1
5 2016-12-13 05:15:00 2016-03-28 21:15:00 259 days 08:00:00        1
6 2017-02-20 15:54:00 2016-04-25 15:54:00 301 days 00:00:00        2
7 2017-05-01 02:33:00 2016-05-23 10:33:00 342 days 16:00:00        2
8 2017-07-09 13:12:00 2016-06-20 05:12:00 384 days 08:00:00        2
9 2017-09-16 23:51:00 2016-07-17 23:51:00 426 days 00:00:00        2

In [261]: df.dtypes
Out[261]:
a            datetime64[ns]
b            datetime64[ns]
interval    timedelta64[ns]
user_id               int64
dtype: object

In [262]: df.groupby('user_id')['interval'].sum()
Out[262]:
user_id
1    838 days 08:00:00
2   1454 days 00:00:00
Name: interval, dtype: timedelta64[ns]

In [263]: df.groupby('user_id')['interval'].apply(lambda x: x.sum())
Out[263]:
user_id
1    838 days 08:00:00
2   1454 days 00:00:00
Name: interval, dtype: timedelta64[ns]

In [264]: df.groupby('user_id').agg(np.sum)
Out[264]:
                  interval
user_id
1        838 days 08:00:00
2       1454 days 00:00:00

所以检查你的数据...

【讨论】:

  • 我发现了问题所在。当我想查看数据框的总和时,您的代码也适用于我。我的意思是,当我想将结果作为新列查看时,它不起作用。如果您运行此代码,它将不起作用: df['duration]= df.groupby('user_id')['interval'].sum()
  • @user3854325,请在我的回答中查看更新
  • @user3854325,如果有帮助,请考虑accepting的答案 - 它也表明您的问题已得到解答
猜你喜欢
  • 2017-11-16
  • 2014-11-18
  • 2019-11-07
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 2021-05-15
  • 2022-07-20
  • 2017-01-14
相关资源
最近更新 更多