0

我有一个相当大的熊猫数据框,它是一个时间序列,每个时间戳都有很多不同的信息(眼动追踪数据)。

部分数据看起来有点像:

In [58]: df
Out[58]:
    time    event
49  44295   NaN
50  44311   NaN
51  44328   NaN
52  44345   2
53  44361   2
54  44378   2
55  44395   2
56  44411   2
57  44428   3
58  44445   3
59  44461   3
60  44478   3 
61  44495   NaN
62  44511   NaN
63  44528   NaN
64  44544   NaN  
65  44561   NaN
66  44578   NaN
67  44594   NaN
68  44611   4
69  44628   4
70  44644   4
71  44661   NaN
72  44678   NaN

我想将每个事件的(时间)持续时间计算为给定事件的最大(时间)-最小(时间),例如事件 2:44411-44345 = 66

这个持续时间我想在一个新列中,以便数据最终如下所示:

In [60]: df
Out[60]:
    time    event    duration
49  44295   NaN      NaN
50  44311   NaN      NaN
51  44328   NaN      NaN
52  44345   2        66
53  44361   2        66
54  44378   2        66
55  44395   2        66
56  44411   2        66
57  44428   3        50
58  44445   3        50
59  44461   3        50
60  44478   3        50
61  44495   NaN      NaN
62  44511   NaN      NaN
63  44528   NaN      NaN
64  44544   NaN      NaN
65  44561   NaN      NaN
66  44578   NaN      NaN
67  44594   NaN      NaN
68  44611   4        33
69  44628   4        33
70  44644   4        33
71  44661   NaN      NaN
72  44678   NaN      NaN

我怎样才能做到这一点?

4

3 回答 3

0

groupby使用from遍历记录itertools。组标准应为事件编号。由于您对数据进行了正确排序(与同一事件相关的所有事件代码都不会被其他事件打断),因此无需对偶数代码进行排序。

groupby将迭代地返回元组 (key, group),其中 key 是偶数代码, group 是所有记录的列表。

从记录中获取最小和最大时间并计算持续时间。

然后,做您的工作以将持续时间作为记录的新字段。

使用熊猫可能有更有效的方法,我不知道。所描述的解决方案不需要熊猫。

于 2013-11-14T13:48:34.723 回答
0

一种方法是使用groupbyand transformmax - min也称为peak-to-peak,或ptp简称,所以ptp这里基本上是指 for lambda x: x.max() - x.min()

>>> df = pd.read_csv("eye.csv",sep="\s+")
>>> df["duration"] = df.dropna().groupby("event")["time"].transform("ptp")
>>> df
     time  event  duration
49  44295    NaN       NaN
50  44311    NaN       NaN
51  44328    NaN       NaN
52  44345      2        66
53  44361      2        66
54  44378      2        66
55  44395      2        66
56  44411      2        66
57  44428      3        50
58  44445      3        50
59  44461      3        50
60  44478      3        50
61  44495    NaN       NaN
62  44511    NaN       NaN
63  44528    NaN       NaN
64  44544    NaN       NaN
65  44561    NaN       NaN
66  44578    NaN       NaN
67  44594    NaN       NaN
68  44611      4        33
69  44628      4        33
70  44644      4        33
71  44661    NaN       NaN
72  44678    NaN       NaN

dropna是为了防止列NaN中的每个值都event被视为自己的事件。ptp(当钥匙也一样时,如何工作也会发生一些奇怪的事情NaN,但这是一个单独的问题。)

于 2013-11-14T14:07:27.590 回答
0

我最终对@DSM 发布的答案进行了以下工作:

df["dur"] = datalist[i][j].groupby("event")["time"].transform("ptp")
dur = []
for i in datalist.index:
    if np.isnan(df["event"][i]): 
        dur.append(df["event"][i])
    else:
        dur.append(df["dur"][i])
df["Duration"] = dur

这至少对我有用。

于 2013-11-15T09:47:22.763 回答