Python 2.7 基于列条件的熊猫多索引
我的csv文件中有大量GPS数据集。Python 2.7 基于列条件的熊猫多索引,python-2.7,pandas,Python 2.7,Pandas,我的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、时间戳、经度、纬度 现在,我正在使用pandas并将文件导入到数据帧中,到目前为止,我已经编写了这段代码 import pandas as pd import numpy as np #this imports the columns an
是这样的
12,1999-09-08 12:12:12, 116.3426, 32.5678
12,1999-09-08 12:12:17, 116.34234, 32.5678
.
.
.
其中每列的格式为id、时间戳、经度、纬度
现在,我正在使用pandas并将文件导入到数据帧中,到目前为止,我已经编写了这段代码
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
现在,我希望具有相同纬度和经度的行被连续索引。。
i、 我的想象是
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..
i、 例如,具有相同纬度和经度值的行将按顺序编制索引。我怎样才能做到这一点?我是熊猫的初学者,所以我对它知之甚少。请帮忙 您应该利用并对其进行计算:
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
首先计算连续重复的(经度、纬度)
元组:
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
然后,我们使用创建一个基于零的索引,该索引不会在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
的索引中,以创建多索引
:
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
您应该利用并对其进行一些计算:
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
首先计算连续重复的(经度、纬度)
元组:
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
然后,我们使用创建一个基于零的索引,该索引不会在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
的索引中,以创建多索引
:
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