使用pandas的groupby和apply进行累积积分

3
我有一个pandas DataFrame,其中包含idxgrpXY列。我想通过对X作为自变量的Y函数的累积积分来获得一个新列。然而,我想将这个累积积分应用到DataFrame中由grp列定义的每个子组上。
以下是我的操作:
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)

out 是每个 grp 值的 ndarrays 序列,我需要将它们映射回 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个回答

3
你可以更改用于创建新列并返回DF的函数,例如:

您可以更改用于创建新列并返回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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接