按时间间隔对pandas数据帧进行分组

时间:2015-04-17 18:23:58

标签: python pandas

我有一些关于如何使用pandas数据帧的问题。我想以两种不同的方式将我的桌子分组。

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

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

这有什么意义吗?有人可以帮帮我吗?我想如果有人知道大熊猫,那它就是小菜一碟。

非常感谢并且一切顺利。

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
4919  2015-03-31  19:56:51       reward    0     0    0
4920  2015-03-31  19:56:58  trialTimout    1     1    0
4921  2015-03-31  19:57:06    trialIdle    1     1    0
4922  2015-03-31  19:57:09    trialIdle    1     1    0
4923  2015-03-31  19:57:09    trialIdle    1     1    0
4924  2015-03-31  19:57:12    trialIdle    1     1    0
4925  2015-03-31  19:57:12    trialIdle    1     1    0
4926  2015-03-31  19:57:12       reward    0     0    0
4927  2015-03-31  19:57:16  trialTimout    1     1    0
4928  2015-03-31  19:57:31    trialIdle    1     1    0
4929  2015-03-31  19:57:44    trialIdle    1     0    0
4930  2015-03-31  19:57:45    trialIdle    1     0    0
4931  2015-03-31  19:58:54    trialIdle    1     0    0
4932  2015-03-31  19:59:56    trialIdle    1     1    0
4933  2015-03-31  19:59:56       reward    0     0    0
4934  2015-03-31  19:59:57  trialTimout    1     1    0
4935  2015-03-31  20:00:02  trialTimout    1     0    0
4936  2015-03-31  20:00:05    trialIdle    1     0    0
4937  2015-03-31  20:00:18    trialIdle    1     0    0
4938  2015-03-31  20:00:19    trialIdle    1     1    0
4939  2015-03-31  20:00:40    trialIdle    1     1    0
4940  2015-03-31  20:00:51    trialIdle    1     0    0
4941  2015-03-31  20:00:51       reward    0     0    0

1 个答案:

答案 0 :(得分: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