2013-03-17 90 views
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

你应该充分利用DataFrame.duplicated,并做一些数学与它:

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 

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你开始首先计算连续重复(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创建不上duplicaes增加一个从零开始的索引。 把一些数学与它获得重复的行的零和他人:

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) 

默认情况下,​​在较低水平比现有的增加了索引。我们必须通过交换时间戳和我们的附加指数之间的水平来完成:

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