DataFrame切分最大连续数组

image-20210606165743294有这样一个dataframe,记录了深度和梯度,现在需要将深度递增的切分出来(<3m),并且获取最长的连续递增dataframe。

  1. tdf['rule2'] = tdf['depth'].diff().gt(3.0).cumsum()
  2. sizes=tdf.groupby('rule2')['depth'].transform('size')
  3. tdf = tdf[sizes == sizes.max()]

image-20210606211148490这个方法真的非常妙,没有想到,特此记录。
记录几个重要的pandas操作,平常没有用到,但这里使用非常方便。

  1. diff()
    diff函数是用来将数据进行某种移动之后与原数据进行比较得出的差异数据;相当于df-df.shift(1)
    函数原型:
    DataFrame.diff(periods=1, axis=0)
    参数:
  • periods:移动的幅度,int类型,默认值为1。
  • axis:移动的方向,{0 or ‘index’, 1 or ‘columns’},如果为0或者’index’,则上下移动,如果为1或者’columns’,则左右移动。

返回值

  • diffed:DataFrame类型
  1. DataFrame.gt() 列出大于某个值的布尔数组
    https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.gt.html
  1. DataFrame.cumsum() 累加和
    这儿用这个函数非常巧妙,这样就能保证连续为True/False的对应位置都为同一个数值。
  1. DataFrame.transform()
  1. >>df = pd.DataFrame({
  2. "Date": [
  3. "2015-05-08", "2015-05-07", "2015-05-06", "2015-05-05",
  4. "2015-05-08", "2015-05-07", "2015-05-06", "2015-05-05"],
  5. "Data": [5, 8, 6, 1, 50, 100, 60, 120],
  6. })
  7. >>df
  8. Date Data
  9. 0 2015-05-08 5
  10. 1 2015-05-07 8
  11. 2 2015-05-06 6
  12. 3 2015-05-05 1
  13. 4 2015-05-08 50
  14. 5 2015-05-07 100
  15. 6 2015-05-06 60
  16. 7 2015-05-05 120
  17. >>df.groupby('Date')['Data'].transform('sum')
  18. 0 55
  19. 1 108
  20. 2 66
  21. 3 121
  22. 4 55
  23. 5 108
  24. 6 66
  25. 7 121
  26. Name: Data, dtype: int64

有点类似apply()。