【问题标题】:Pandas, split dataframe by monotonic increase of column valuePandas,通过列值的单调增加来拆分数据帧
【发布时间】:2016-09-24 19:29:25
【问题描述】:

我有一个巨大的数据框,其中包含一个名为 time 的 datetime 类型列和另一个名为 dist 的 float 类型列,该数据框是根据时间排序的,并且已经是 dist。 我想根据 dist 的单调增加将数据帧分成几个数据帧。

拆分

   dt                    dist
0  20160811 11:10        1.0
1  20160811 11:15        1.4
2  20160811 12:15        1.8
3  20160811 12:32        0.6
4  20160811 12:34        0.8
5  20160811 14:38        0.2

进入

   dt                    dist
0  20160811 11:10        1.0
1  20160811 11:15        1.4
2  20160811 12:15        1.8

   dt                    dist
0  20160811 12:32        0.6
1  20160811 12:34        0.8

   dt                    dist
0  20160811 14:38        0.2

【问题讨论】:

    标签: python pandas numpy dataframe


    【解决方案1】:

    您可以计算dist 列的差异向量,然后在条件diff < 0 上执行cumsum()(只要dist 从先前的值减少,这就会创建一个新的ID)

    df['id'] = (df.dist.diff() < 0).cumsum()
    
    print(df)
    
    #               dt  dist  id
    #0  20160811 11:10   1.0   0
    #1  20160811 11:15   1.4   0
    #2  20160811 12:15   1.8   0
    #3  20160811 12:32   0.6   1
    #4  20160811 12:34   0.8   1
    #5  20160811 14:38   0.2   2
    
    for _, g in df.groupby((df.dist.diff() < 0).cumsum()):
        print(g)
    
    #               dt  dist
    #0  20160811 11:10   1.0
    #1  20160811 11:15   1.4
    #2  20160811 12:15   1.8
    #               dt  dist
    #3  20160811 12:32   0.6
    #4  20160811 12:34   0.8
    #               dt  dist
    #5  20160811 14:38   0.2
    

    【讨论】:

      【解决方案2】:

      您可以使用np.split() 方法:

      In [92]: df
      Out[92]:
                         dt  dist
      0 2016-08-11 11:10:00   1.0
      1 2016-08-11 11:15:00   1.4
      2 2016-08-11 12:15:00   1.8
      3 2016-08-11 12:32:00   0.6
      4 2016-08-11 12:34:00   0.8
      5 2016-08-11 14:38:00   0.2
      
      In [93]: dfs = np.split(df, df[df.dist.diff().fillna(0) < 0].index)
      
      In [94]: [print(x) for x in dfs]
                         dt  dist
      0 2016-08-11 11:10:00   1.0
      1 2016-08-11 11:15:00   1.4
      2 2016-08-11 12:15:00   1.8
                         dt  dist
      3 2016-08-11 12:32:00   0.6
      4 2016-08-11 12:34:00   0.8
                         dt  dist
      5 2016-08-11 14:38:00   0.2
      Out[94]: [None, None, None]
      

      解释:

      In [97]: df.dist.diff().fillna(0) < 0
      Out[97]:
      0    False
      1    False
      2    False
      3     True
      4    False
      5     True
      Name: dist, dtype: bool
      
      In [98]: df[df.dist.diff().fillna(0) < 0]
      Out[98]:
                         dt  dist
      3 2016-08-11 12:32:00   0.6
      5 2016-08-11 14:38:00   0.2
      
      In [99]: df[df.dist.diff().fillna(0) < 0].index
      Out[99]: Int64Index([3, 5], dtype='int64')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 2015-12-30
        • 2021-04-29
        • 1970-01-01
        • 2020-03-31
        • 2018-05-05
        • 2021-09-18
        相关资源
        最近更新 更多