使用pandas groupby并申请累积积分

Posted

技术标签:

【中文标题】使用pandas groupby并申请累积积分【英文标题】:Using pandas groupby and apply for cumulative integration 【发布时间】:2021-05-13 01:59:20 【问题描述】:

我有一个带有 idxgrpXY 列的 pandas DataFrame,我想获得一个新列,其中包含 Y 函数相对于 @987654326 的累积积分@。但是,我想将此累积集成应用于由列 grp 定义的 DataFrame 的每个子组。

这就是我正在做的事情:

import numpy as np
import pandas as pd
from scipy import integrate

def myIntegral(DF, n):
    A0 = 200
    return integrate.cumtrapz((A0/DF.Y)**n, DF.X, initial=0)

data = pd.DataFrame('idx' : [1,2,3,4,5,6],
                     'grp' : [2,2,2,2,3,3],
                     'X' : [.1,.2,.3,.4,.2,.3],
                     'Y' : [3,4,4,3,2,3]
                    )
data.sort_values(by=['grp', 'X'], inplace=True)

out = data.groupby('grp').apply(myIntegral, n=0.5)

outgrp 的每个值的一系列 ndarray,我需要将其映射回 DataFrame:

data_grouped = data.groupby('grp')
out2 = []
for grp, DF in data_grouped:
   DF['Z'] = out.loc[grp]
   out2.append(DF)
data = pd.concat(out2)

它可以工作,但是通过一系列 ndarrays 的步骤看起来真的很难看并且容易出错。建议如何改进?此外,我将使用的数据集相当大,因此我正在努力寻找一个有效的解决方案。

谢谢!

【问题讨论】:

【参考方案1】:

您可以更改创建新列的函数并返回DF,例如:

def myIntegral(DF, n):
    A0 = 200
    DF['new'] = integrate.cumtrapz((A0/DF.Y)**n, DF.X, initial=0)
    return DF

data = pd.DataFrame('idx' : [1,2,3,4,5,6],
                     'grp' : [2,2,2,2,3,3],
                     'X' : [.1,.2,.3,.4,.2,.3],
                     'Y' : [3,4,4,3,2,3]
                    )
data.sort_values(by=['grp', 'X'], inplace=True)

out = data.groupby('grp').apply(myIntegral, n=0.5)
print (out)
  idx  grp    X  Y       new
0    1    2  0.1  3  0.000000
1    2    2  0.2  4  0.761802
2    3    2  0.3  4  1.468908
3    4    2  0.4  3  2.230710
4    5    3  0.2  2  0.000000
5    6    3  0.3  3  0.908248

【讨论】:

以上是关于使用pandas groupby并申请累积积分的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:将重采样与 groupby 相结合并计算时间差

在 Python Pandas 中使用 cumsum 和 groupby 并在值为 0 时重置 cumsum

熊猫:GroupBy Shift 和累积和

如何正确使用带有应用功能的熊猫 groupby 来解决副作用? (第一组申请两次)

Pandas DataFrame groupby,跨列计数和求和

pandas.groupby中的迭代