【问题标题】:Calculating numeric differences per group in pandas计算熊猫中每组的数值差异
【发布时间】:2015-03-26 13:19:42
【问题描述】:

我的数据框具有以下结构:

patient_id  |  timestamp  |  measurement
A           |  2014-10-10 |  5.7
A           |  2014-10-11 |  6.3
B           |  2014-10-11 |  6.1
B           |  2014-10-10 |  4.1

我想计算每个患者每次测量之间的delta(差异)。

结果应该是这样的:

patient_id  |  timestamp  |  measurement  |    delta
A           |  2014-10-10 |  5.7          |     NaN
A           |  2014-10-11 |  6.3          |     0.6
B           |  2014-10-11 |  6.1          |     2.0
B           |  2014-10-10 |  4.1          |     NaN

如何在 pandas 中最优雅地做到这一点?

【问题讨论】:

    标签: python python-2.7 pandas time-series dataframe


    【解决方案1】:

    在“测量”列上调用transform并传递方法diff,transform返回一个索引与原始df对齐的序列:

    In [4]:
    
    df['delta'] = df.groupby('patient_id')['measurement'].transform(pd.Series.diff)
    df
    Out[4]:
      patient_id   timestamp  measurement  delta
    0          A  2014-10-10          5.7    NaN
    1          A  2014-10-11          6.3    0.6
    2          B  2014-10-10          4.1    NaN
    3          B  2014-10-11          6.1    2.0
    

    编辑

    如果您打算对 transform 的结果进行排序,请先对 df 进行排序:

    In [10]:
    
    df['delta'] = df.sort(columns=['patient_id', 'timestamp']).groupby('patient_id')['measurement'].transform(pd.Series.diff)
    df
    Out[10]:
      patient_id   timestamp  measurement  delta
    0          A  2014-10-10          5.7    NaN
    1          A  2014-10-11          6.3    0.6
    2          B  2014-10-11          6.1    2.0
    3          B  2014-10-10          4.1    NaN
    

    【讨论】:

    • 我不明白如何将timestamp 考虑在内
    • 抱歉,您要求在measurement 上而不是在timestamp 上提供增量,因此timestamp 不受影响,您能否更好地解释一下,因为您的问题中根本没有提到这一点,也没有它在您想要的输出中很明显
    • 我不想依赖于行的顺序,而是依赖于时间戳的顺序。我编辑了原始问题以澄清
    • 做同样的事情,只是先按时间戳排序。 df.sort("timestamp", inplace=True)
    猜你喜欢
    • 1970-01-01
    • 2019-11-03
    • 2021-01-05
    • 1970-01-01
    • 2017-06-25
    • 2017-12-30
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多