我有一个相当大的熊猫数据框,这是一个时间序列,每个时间戳(眼动追踪数据)都有很多不同的信息。
部分数据看起来有点像:
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
我想计算每个事件的(时间)持续时间,作为给定事件的最大(时间)-min(时间),例如活动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
我该怎么做?
答案 0 :(得分:0)
使用groupby
中的itertools
对记录进行迭代。组标准应为事件编号。由于您已正确排序数据(与同一事件相关的所有事件代码不会被其他事件中断),因此无需对偶数代码进行排序。
groupby
将迭代返回元组(键,组),其中键是偶数代码,组是所有记录的列表。
从记录中,选择最小和最大时间并计算持续时间。
然后,做你的工作,将持续时间作为记录的新字段。
使用pandas可能有更有效的方法,我不知道。所描述的解决方案不需要大熊猫。
答案 1 :(得分:0)
一种方法是使用groupby
和transform
。 max - min
也称为peak-to-peak
,简称ptp
,因此ptp
基本上代表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
的工作方式也有些奇怪,但这是一个单独的问题。)
答案 2 :(得分: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
这至少对我有用。