2

csv ファイルに巨大な GPS データセットがあります。
こんな感じです。

12,1999-09-08 12:12:12, 116.3426, 32.5678

12,1999-09-08 12:12:17, 116.34234, 32.5678

.
.
.

各列の形式は次のとおりです。
id, timestamp, longitude, latitude

現在、パンダを使用してファイルをデータフレームにインポートしています。これまでのところ、このコードを記述しています。

import pandas as pd
import numpy as np
#this imports the columns and making the timestamp values as row indexes
df = pd.read_csv('/home/abc/Downloads/..../366.txt',delimiter=',',
                index_col=1,names=['id','longitude','latitude'])
#removes repeated entries due to gps errors. 
df = df.groupby(df.index).first()

場合によっては、削除する必要がある同じ日付のエントリが 2 つまたは 3 つあることがあります。

私はこのようなものを手に入れます

                       id  longitude  latitude
1999-09-08 12:12:12    12  116.3426   32.5678
1999-09-08 12:12:17    12  116.34234  32.5678
# and so on with redundant entries removed

今、同じ緯度と経度を持つ行に連続してインデックスを付けたい..つまり、私の視覚化は

                      id  longitude  latitude
0 1999-09-08 12:12:12 12  116.3426    32.5678
1 1999-09-08 12:12:17 12  116.34234   32.5678
2 1999-09-08 12:12:22 12  116.342341  32.5678
  1999-09-08 12:12:27 12  116.342341  32.5678
  1999-09-08 12:12:32 12  116.342341  32.5678
  ....
  1999-09-08 12:19:37 12  116.342341  32.5678
3 1999-09-08 12:19:42 12  116.34234   32.56123
  and so on..

つまり、緯度と経度の値が同じ行は、連続して索引付けされます。どうすればそれを達成できますか? 私はパンダの初心者なので、それについてあまり知りません。助けてください!

4

1 に答える 1

4

を活用してDataFrame.duplicated、いくつかの計算を行う必要があります。

idx = df.duplicated(['longitude', 'latitude'])
idx *= -1
idx += 1
idx.ix[0] = 0
df = df.set_index(idx.cumsum(), append=True).swaplevel(0,1)

コードの仕組み

から始めて、df次を取得します。

In [215]: df
Out[215]: 
                     id   longitude  latitude
stamp                                        
1999-09-08T12:12:12  12  116.342600  32.56780
1999-09-08T12:12:17  12  116.342340  32.56780
1999-09-08T12:12:22  12  116.342341  32.56780
1999-09-08T12:12:27  12  116.342341  32.56780
1999-09-08T12:12:32  12  116.342341  32.56780
1999-09-08T12:19:37  12  116.342341  32.56780
1999-09-08T12:19:42  12  116.342340  32.56123

最初に、連続して複製された(longitude, latitude)タプルを計算します。

In [216]: idx = df.duplicated(['longitude', 'latitude'])

In [217]: idx
Out[217]: 
stamp
1999-09-08T12:12:12    False
1999-09-08T12:12:17    False
1999-09-08T12:12:22    False
1999-09-08T12:12:27     True
1999-09-08T12:12:32     True
1999-09-08T12:19:37     True
1999-09-08T12:19:42    False

次にcumsum、重複でインクリメントしないゼロベースのインデックスを作成するために使用します。いくつかの数学を入れて、重複した行にゼロを取得し、他の行に 1 を取得します。

In [218]: idx *= -1
In [219]: idx += 1


In [220]: idx
Out[220]: 
stamp
1999-09-08T12:12:12    1
1999-09-08T12:12:17    1
1999-09-08T12:12:22    1
1999-09-08T12:12:27    0
1999-09-08T12:12:32    0
1999-09-08T12:19:37    0
1999-09-08T12:19:42    1

ゼロベースのインデックスが必要なため、最初のセルを に設定し、0その列を のインデックスに追加してdfを作成しますMultiIndex

In [221]: idx.ix[0] = 0
In [222]: df = df.set_index(idx.cumsum(), append=True)

デフォルトでset_indexは、既存のインデックスよりも下位レベルにインデックスを追加します。タイムスタンプと追加のインデックスの間でレベルを交換して終了する必要があります。

In [223]: df = df.swaplevel(0,1)

In [224]: df
Out[224]: 
                       id   longitude  latitude
  stamp                                        
0 1999-09-08T12:12:12  12  116.342600  32.56780
1 1999-09-08T12:12:17  12  116.342340  32.56780
2 1999-09-08T12:12:22  12  116.342341  32.56780
  1999-09-08T12:12:27  12  116.342341  32.56780
  1999-09-08T12:12:32  12  116.342341  32.56780
  1999-09-08T12:19:37  12  116.342341  32.56780
3 1999-09-08T12:19:42  12  116.342340  32.56123
于 2013-03-17T20:50:16.907 に答える