【问题标题】:Grouping pandas data frame by time intervals按时间间隔对熊猫数据帧进行分组
【发布时间】:2023-03-16 04:26:01
【问题描述】:

我有几个关于如何使用 pandas 数据框的问题。我想以两种不同的方式对我的表进行分组。

首先,我想将条目分组为特定的时间间隔。假设我想将以下条目分组为 3 分钟间隔。我该怎么做?

其次,我想将第 4 列中的特定字符串顺序定义为一个事件(即从一个“奖励”到下一个)。接下来,我想将 5 个后续事件组合在一起。

这有意义吗?任何人都可以帮助我吗?我想如果有人知道熊猫,那将是小菜一碟。

非常感谢,一切顺利。

4914 2015-03-31 19:56:34 试用空闲 1 0 0 4915 2015-03-31 19:56:36 试用空闲 1 0 0 4916 2015-03-31 19:56:39 试用空闲 1 0 0 4917 2015-03-31 19:56:39 试用空闲 1 1 0 4918 2015-03-31 19:56:51 试用空闲 1 0 0 4919 2015-03-31 19:56:51 奖励 0 0 0 4920 2015-03-31 19:56:58 试用Timout 1 1 0 4921 2015-03-31 19:57:06 试用空闲 1 1 0 4922 2015-03-31 19:57:09 试用空闲 1 1 0 4923 2015-03-31 19:57:09 试用空闲 1 1 0 4924 2015-03-31 19:57:12 试用空闲 1 1 0 4925 2015-03-31 19:57:12 试用空闲 1 1 0 4926 2015-03-31 19:57:12 奖励 0 0 0 4927 2015-03-31 19:57:16 试验Timout 1 1 0 4928 2015-03-31 19:57:31 试用空闲 1 1 0 4929 2015-03-31 19:57:44 试用空闲 1 0 0 4930 2015-03-31 19:57:45 试用空闲 1 0 0 4931 2015-03-31 19:58:54 试用空闲 1 0 0 4932 2015-03-31 19:59:56 试用空闲 1 1 0 4933 2015-03-31 19:59:56 奖励 0 0 0 4934 2015-03-31 19:59:57 试验Timout 1 1 0 4935 2015-03-31 20:00:02 试验Timout 1 0 0 4936 2015-03-31 20:00:05 试用空闲 1 0 0 4937 2015-03-31 20:00:18 试用空闲 1 0 0 4938 2015-03-31 20:00:19 试用空闲 1 1 0 4939 2015-03-31 20:00:40 试用空闲 1 1 0 4940 2015-03-31 20:00:51 试用空闲 1 0 0 4941 2015-03-31 20:00:51 奖励 0 0 0

【问题讨论】:

标签: python pandas


【解决方案1】:

从您提供的转储中了解数据的结构有点困难。我将假设日期和时间信息代表 DataFrame 中的一列,该列存储为一系列 pandas 时间戳。如果没有,您将需要将其转换为这种格式。对我来说,这是在第 1 列...

In [15]: print(df.head())
                         1           2  3  4  5
0                                              
4914   2015-03-31 19:56:34   trialIdle  1  0  0
4915   2015-03-31 19:56:36   trialIdle  1  0  0
4916   2015-03-31 19:56:39   trialIdle  1  0  0
4917   2015-03-31 19:56:39   trialIdle  1  1  0
4918   2015-03-31 19:56:51   trialIdle  1  0  0

接下来,我们将索引设为时间戳...

In [16]: df.index = pd.DatetimeIndex(df[1])

[编辑]为第 2 列中的每个类别创建一个新列

In [17]: for col in df[2].unique():
   ....:     df[col] = (df[2] == col).astype(int)

然后我们重新采样

In [18]: dfrs = df.resample('3min', how=sum)

让我们看看我们得到了什么

In [19]: print(dfrs)
                      3  4  5  trialIdle  reward  trialTimout
2015-03-31 19:54:00   6  2  0          5       1            1
2015-03-31 19:57:00  12  9  0         10       2            2
2015-03-31 20:00:00   6  2  0          5       1            1

[编辑] 在将事件组合在一起方面 - 以下代码查看奖励线和所有后续线,直到(并排除)下一个奖励线。我称之为奖励组(rwg)。

df['rwg'] = np.nan
df.loc[df[2]=='reward', 'rwg'] = range(1, sum(df[2]=='reward')+1 )
df['rwg'] = df['rwg'].ffill()   # bfill() if you want to group the other way
df['rwg'] = df['rwg'].fillna(0) # the initial group without a preceding reward
dfrwg = df.groupby('rwg').sum()
print(dfrwg)

注意:如果您想对通往奖励线的行进行分组,请使用上面的 bfill() 而不是 ffill()。

ffill() 方法产生

In [119]: print(dfrwg)
     3  4  5  trialIdle  reward  trialTimout
rwg                                         
0    5  1  0          5       0            0
1    6  6  0          5       1            1
2    6  3  0          5       1            1
3    7  3  0          5       1            2
4    0  0  0          0       1            0

【讨论】:

  • 嘿,马克,谢谢,这正是我想要的。剩下的唯一问题是,我也想对该区间内的字符串求和。因此,例如,如果在该间隔中有 10 个“trialIdle”。那可能吗?另外,您对问题的第二部分有解决方案吗?到目前为止非常感谢。
  • 好的 - 将添加一个建议 - 给我几分钟
  • 不太确定您想如何对事件进行分组,但试了一下,应该可以轻松适应。
  • 嘿,马克,这太完美了。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
  • 1970-01-01
  • 2017-01-29
  • 2021-07-07
  • 2014-11-17
  • 2019-06-23
  • 2017-10-21
相关资源
最近更新 更多