【问题标题】:Conditional based on slope between two rows in Pandas DataFrame基于 Pandas DataFrame 中两行之间的斜率的条件
【发布时间】:2016-11-11 17:33:14
【问题描述】:

我正在尝试创建一个程序,该程序将在大型时间序列数据框中选择行并仅返回斜率 (row2-row1)/(Time2-Time1) >= 前两行的斜率的行 ( row1-row0)/(Time1-Time0)。我经历了一些非常繁重的循环操作,只是为了满足循环的范围。

Time        A           B           C
1.731806    NA          NA          6.715383
1.794554    NA          6.899219    6.952729
1.79434     6.689599    6.903747    6.860664
1.928432    6.962717    7.126891    7.115988
2.000463    7.226573    7.330078    7.362645
2.090469    7.444833    7.632159    7.575328
2.175347    7.709757    7.836567    7.663173
2.765631    8.904291    8.970686    8.894602
2.905104    9.018817    8.997333    8.97221
2.980718    8.796641    8.793764    8.637462
3.058576    9.050172    9.118444    9.174402

我希望有一个简单的矢量化方法来解决这个问题,但我也想更进一步,我想返回斜率 (row3-row2)/(Time3-Time2) >= 的值行之间前两个斜率的平均值 ([(row2-row1)/(Time2-Time1)]+[row1-row0)/(Time1-Time0)])/2 或只是 (row2-row0)/(Time2-Time0 )。

数据框也非常大,所以我希望在许多列(A、B、C...Z)上迭代这个函数,这就是为什么我希望采用矢量化方法,我不在乎关于整个操作的速度。

非常感谢您对问题的任何部分的帮助。它用于在非常大的数据集中忽略进入稳定阶段(当斜率下降时)的微生物生长数据。 NA 的仅供参考的数据点存在,因为我创建了一个条件行来过滤掉微生物生长的滞后阶段。

非常感谢!!!

【问题讨论】:

    标签: python pandas numpy dataframe


    【解决方案1】:

    让我们从计算斜率的数据框开始:

    slopes = df.iloc[:, 1:].diff().div(df.Time.diff(), axis=0)
    

    这使用diff 或每一行与前一行的差异,并将不是第一列的每一列除以第一列。

    我们不妨同时计算三个周期斜率。

    three_period_slopes = df.iloc[:, 1:].diff(2).div(df.Time.diff(2), axis=0)
    

    现在,您提到对每一列都执行此操作,并且您希望将其矢量化。因此,我们将计算真实值的数据框,以便稍后用于切片。

    slope >= 前两行的斜率

    gt_prior_slope = slopes >= slopes.shift()
    

    slope >= 前两个斜率的平均值

    gt_prior_2_slope_avg = slopes >= slopes.rolling(2).mean().shift()
    

    slope >= 前三个周期的斜率

    gt_prior_3_period_slope = slopes >= three_period_slopes.shift()
    

    我们这样使用它们:

    “C”列斜率 >= 前一个斜率

    df.C[gt_prior_slope.C]
    
    2     6.860664
    4     7.362645
    7     8.894602
    10    9.174402
    Name: C, dtype: float64
    

    【讨论】:

    • 感谢一百万,这太完美了!
    猜你喜欢
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 2018-12-13
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多