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

1 つの方法はgroupby、 andを使用することtransformです。 または略してmax - minとも呼ばれ、ここでは基本的に for を意味します。peak-to-peakptpptplambda 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

これは、列のdropnaNaN値がevent独自のイベントと見なされないようにするためです。ptp(キーがNaNあまりにもある場合にどのように機能するかについても奇妙なことが起こっていますが、それは別の問題です.)

于 2013-11-14T14:07:27.590 に答える
0

groupbyfromを使用してレコードを反復処理しますitertools。グループ基準はイベント番号とする。データが適切に並べられているため (同じイベントに関連するすべてのイベント コードが他のイベントによって中断されない)、偶数コードで並べ替えを行う必要はありません。

groupbyタプル (キー、グループ) を繰り返し返します。ここで、キーは偶数コード、グループはすべてのレコードのリストです。

レコードから、最小時間と最大時間をピックアップし、期間を計算します。

次に、期間をレコードの新しいフィールドとして取得する作業を行います。

私が気付いていないパンダを使用したより効率的な方法があるかもしれません。説明されているソリューションでは、パンダは必要ありません。

于 2013-11-14T13:48:34.723 に答える
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 に答える