【问题标题】:Pandas groupby time intervals熊猫分组时间间隔
【发布时间】:2014-11-17 01:35:07
【问题描述】:

我有两个数据框。 DF1 包含以下内容:

用户 |时间间隔

用户01 | [01/01/2014 08:12:00, 01/01/2014 08:13:43]

用户02 | [01/03/2014 07:21:44, 01/04/2014 01:07:01]

DF 2 包含事件:

用户 |时间 |价值

用户01 | 01/03/2014 04:11:00 | 9

用户01 | 2014 年 1 月 1 日 08:10:00 | 12

用户02 | 2014 年 1 月 3 日 09:11:00 | 3

用户02 | 2014 年 1 月 2 日 011:10:00 | 21

我想根据 DF2 中的事件向 DF1 添加 3 列,包含时间间隔内每个用户的平均值、标准差和最大值。

所以最终的结果应该是这样的:

用户 |时间间隔 |平均值 |最大 |标准差

用户01 | [01/01/2014 08:12:00, 01/01/2014 08:13:43] |钠 |钠 |南

用户02 | [01/03/2014 07:21:44, 01/04/2014 01:07:01] | 3 | 3 | 0

如果我的表很大,有什么有效的方法来做到这一点?基于另一个数据帧的时间间隔是否有某种“groupby”函数?

代码:

import pandas as pd

DF1 = pd.DataFrame({'User' : pd.Series(["User01", "User02"], index=['1', '2']), 'Time start' : pd.Series(["01/01/2014 08:12:00", "01/03/2014 07:21:44"], index=['1', '2']),'Time end' : pd.Series(["01/01/2014 08:13:43", "01/04/2014 01:07:01"], index=['1', '2'])})

DF2 = pd.DataFrame({'User' : pd.Series(["User01","User01","User02", "User02"], index=['1', '2','3','4']), 'Time' : pd.Series(["01/03/2014 04:11:00", "01/01/2014 08:10:00","01/03/2014 09:11:00","01/02/2014 011:10:00"], index=['1', '2','3', '4']),'Value' : pd.Series([9,12,3,21], index=['1', '2','3','4'])})

DF3 = pd.DataFrame({'User' : pd.Series(["User01", "User02"], index=['1', '2']), 'Time start' : pd.Series(["01/01/2014 08:12:00", "01/03/2014 07:21:44"], index=['1', '2']),'Time end' : pd.Series(["01/01/2014 08:13:43", "01/04/2014 01:07:01"], index=['1', '2']),'Mean' : pd.Series(["Nan", 3], index=['1', '2']),'Max' : pd.Series(["Nan", 3], index=['1', '2']),'StDev' : pd.Series(["Nan", 0], index=['1', '2'])})

【问题讨论】:

  • 拥有可复制粘贴的示例很有帮助。还要通过您提供的示例发布您预期的解决方案应该是什么样子。这应该可以通过将您的 Time interval 列分成两部分来实现,一个低端和一个高端,然后在第二个数据帧上使用类似 between_time 的东西。
  • 谢谢。您能具体说明一下复制可粘贴示例的含义吗?
  • 你说你的数据框是什么样的,但你没有提供创建它们的代码。这意味着任何试图帮助您的人都必须首先编写代码来创建这些数据帧。复制和粘贴代码以达到现在的状态要容易得多,而不是浪费时间尝试重新创建数据结构。尝试对您的对象执行 df.to_dict(),然后发布 DF1 = pandas.DataFrame({'User': ...}) 等代码,而不仅仅是用文字描述您拥有的内容。
  • 首先你应该清理你的帧,一个好的开始是将你的时间间隔的开始和结束提取为日期时间列。尚不清楚用户是否是唯一的(您是否只关心某个时间间隔内的行为?如果是,那会让事情变得更容易。)
  • 知道了。添加了生成 DF 的代码。开始和结束时间也分开。现在查看 between_time。

标签: python pandas large-data


【解决方案1】:

首先,合并DF1和DF2

df = DF2.merge(DF1,on="User")

如果时间在时间​​开始和时间结束之间,则创建一个指标(“保持”)

import numpy as np
df.loc[:,"keep"] = (np.logical_and(df.loc[:,"Time start"]<=df.loc[:,"Time"],df.loc[:,"Time"]<=df.loc[:,"Time end"]))*1

输出:

    Time                User  Value Time end            Time start       keep
 2014-01-03 04:11:00    User01  9   2014-01-01 08:13:43 2014-01-01 08:12:00 0
 2014-01-01 08:10:00    User01  12  2014-01-01 08:13:43 2014-01-01 08:12:00 0
 2014-01-03 09:11:00    User02  3   2014-01-04 01:07:01 2014-01-03 07:21:44 1
 2014-01-02 11:10:00    User02  21  2014-01-04 01:07:01 2014-01-03 07:21:44 0

现在只保留keep=1的行

df = df.loc[df.keep==1,:]

现在使用 groupby 对 df 进行聚合

df4 = df.groupby("User")["Value"].agg(['max','mean','std']).reset_index()

输出:

    User    max mean    std
    User02  3   3   NaN

将 df4 与 DF1 合并

DF1.merge(df4.reset_index(), on="User",how="left")

输出:

 Time end           Time start          User    max mean std
2014-01-01 08:13:43 2014-01-01 08:12:00 User01  NaN NaN NaN
2014-01-04 01:07:01 2014-01-03 07:21:44 User02  3.0 3.0 NaN

【讨论】:

  • 否决我的答案的人请告诉我为什么?以便我可以帮助您。
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 2020-07-30
  • 2021-03-24
  • 1970-01-01
  • 2021-12-01
相关资源
最近更新 更多