我有一些关于如何使用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
答案 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