【问题标题】:MultiIndexing in pandas based on column conditions基于列条件的 Pandas 中的多索引
【发布时间】:2013-03-05 23:21:27
【问题描述】:

我在 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

现在,我正在使用 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

现在我希望对具有相同纬度和经度的行进行连续索引.. 即,我的可视化是

                      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..

即,具有相同纬度和经度值的行将被连续索引。我怎样才能做到这一点?我是熊猫的初学者,所以我不太了解它。请帮忙!

【问题讨论】:

    标签: python-2.7 pandas


    【解决方案1】:

    您应该利用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 创建一个从零开始的索引,该索引不会在重复项上增加。 用它做一些数学运算,以获得重复行的零和其他行的零:

    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
    

    【讨论】:

      猜你喜欢
      • 2018-11-09
      • 2017-04-12
      • 2016-08-04
      • 2021-10-19
      • 1970-01-01
      • 2021-09-06
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多