python - 使用pandas groupby并申请累积积分
问题描述
idx
我有一个带有, grp
, X
,列的 pandas DataFrame Y
,我想获得一个新列,其中包含 的函数Y
相对于的累积积分X
。但是,我想将此累积积分应用于由 column 定义的 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
是 的每个值的一系列 ndarray grp
,我需要将其映射回 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 的步骤看起来真的很难看并且容易出错。建议如何改进?此外,我将使用的数据集相当大,因此我正在尝试找到一个有效的解决方案。
谢谢!
解决方案
您可以更改创建新列的函数并返回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
推荐阅读
- arrays - 当我运行代码时,这段代码有什么问题,它没有给出所需的输出
- aws-api-gateway - 如何创建 REST api 并将其部署在云中?
- r - 如果年份是 x 或 y,则每隔一行跳过一次,否则,只需转到管道中的下一行代码
- javascript - 需要一个函数,该函数使用 lodash 从数组中的两个嵌套对象中解析出数据,并将其作为道具传递给反应组件
- sql - “不喜欢的地方”不排除所有
- vba - 如何与 Excel 建立一个可以同时打开多个用户的数据库连接?
- java - 将字符串转换为 Java 中的索引列表映射
- php - 如何防止 Phpmailer 将嵌入图像作为附件发送?
- json - Ansible解析json
- mysql - 在docker中运行flyway时连接被拒绝