我以前发布过这个问题,但由于有类似的问题被问到,它一直在关闭,但这些解决方案在这里对我没有帮助.

我有一个数据帧,需要由3个不同的列分组.从结果分组中,我需要执行计算,然后将结果应用于新列中的每一行.

我的数据是这样的:

ID   Deal  Party  Commodity       startdate  enddate  fixedpricestrike  quantity  mtmvalue
---- ----- -----  ---------       ---------  -------  ----------------  --------  ---------
J1   Sell   J   (stock1, stock2)   01Jan23   01Feb23        10.00          10      100.00
J2   Sell   J   (stock1, stock2)   01Jan23   01Feb23        10.00          10      100.00
J3   Buy    J   (stock1, stock2)   01Jan23   01Feb23        5.00           10      50.00
J4   Buy    J   (stock1, stock2)   01Jan23   01Feb23        5.00           5       25.00

我的目标是按[Deal,Commodity,StartDate]对数据进行分组,结果数据如下所示:

ID   Deal  Party  Commodity       startdate  enddate  fixedpricestrike  quantity  mtmvalue
---- ----- -----  ---------       ---------  -------  ----------------  --------  ---------
J1   Sell   J   (stock1, stock2)   01Jan23   01Feb23        10.00          10      100.00
J2   Sell   J   (stock1, stock2)   01Jan23   01Feb23        10.00          10      100.00

ID   Deal  Party  Commodity       startdate  enddate  fixedpricestrike  quantity  mtmvalue
---- ----- -----  ---------       ---------  -------  ----------------  --------  ---------
J3   Buy    J   (stock1, stock2)   01Jan23   01Feb23        5.00           10      50.00
J4   Buy    J   (stock1, stock2)   01Jan23   01Feb23        5.00           5       25.00

因此,我需要使用一个公式来计算‘fPrice’,并将其添加到每一行中,如下所示:

ID   Deal  Party  Commodity       startdate  enddate  fixedpricestrike  quantity  mtmvalue fprice
---- ----- -----  ---------       ---------  -------  ----------------  --------  --------- -----
J1   Sell   J   (stock1, stock2)   01Jan23   01Feb23        10.00          10      100.00    0
J2   Sell   J   (stock1, stock2)   01Jan23   01Feb23        10.00          10      100.00    0

ID   Deal  Party  Commodity       startdate  enddate  fixedpricestrike  quantity  mtmvalue fprice
---- ----- -----  ---------       ---------  -------  ----------------  --------  --------- -----
J3   Buy    J   (stock1, stock2)   01Jan23   01Feb23        5.00           10      50.00     1.25
J4   Buy    J   (stock1, stock2)   01Jan23   01Feb23        5.00           10      25.00     1.25

我的问题在于下一步,当我try 将fPrice添加回原始数据帧时 我有这样一行代码:

df['fprice'] = df.groupby(['StartDate', 'Commodity', 'Deal']).apply(lambda group: -(group['MTMValue'].sum() - (group['FixedPriceStrike'] * group['Quantity']).sum()) / group['Quantity'].sum()).reset_index(drop=True)

它返回以下数据帧:

ID   Deal  Party  Commodity       startdate  enddate  fixedpricestrike  quantity  mtmvalue fprice
---- ----- -----  ---------       ---------  -------  ----------------  --------  --------- -----
J1   Sell   J   (stock1, stock2)   01Jan23   01Feb23        10.00          10      100.00    0
J2   Sell   J   (stock1, stock2)   01Jan23   01Feb23        10.00          10      100.00    1.25
J3   Buy    J   (stock1, stock2)   01Jan23   01Feb23        5.00           10      50.00     
J4   Buy    J   (stock1, stock2)   01Jan23   01Feb23        5.00           10      25.00     

当结果应该是这样的时候

ID   Deal  Party  Commodity       startdate  enddate  fixedpricestrike  quantity  mtmvalue fprice
---- ----- -----  ---------       ---------  -------  ----------------  --------  --------- -----
J1   Sell   J   (stock1, stock2)   01Jan23   01Feb23        10.00          10      100.00    0
J2   Sell   J   (stock1, stock2)   01Jan23   01Feb23        10.00          10      100.00    0
J3   Buy    J   (stock1, stock2)   01Jan23   01Feb23        5.00           10      50.00     1.25
J4   Buy    J   (stock1, stock2)   01Jan23   01Feb23        5.00           10      25.00     1.25

我对使用Pandas 也比较陌生,我不确定为什么我的结果会是这样的.任何建议都会有所帮助

推荐答案

而不是一步完成,你可以首先计算‘fPrice’,然后将它合并回原始的DataFrame:

# Calculate 'fprice' for each group
grouped = df.groupby(['startdate', 'Commodity', 'Deal']).apply(
    lambda group: -(group['mtmvalue'].sum() - (group['fixedpricestrike'] * group['quantity']).sum()) / group['quantity'].sum()
).reset_index(name='fprice')

# Merge 'fprice' back to the original DataFrame
df = pd.merge(df, grouped, on=['startdate', 'Commodity', 'Deal'], how='left')

Python相关问答推荐

"使用odbc_connect(raw)连接字符串登录失败;可用于pyodbc"

PyQt5,如何使每个对象的 colored颜色 不同?'

把一个pandas文件夹从juyter笔记本放到堆栈溢出问题中的最快方法?

如何设置视频语言时上传到YouTube与Python API客户端

计算每个IP的平均值

mypy无法推断类型参数.List和Iterable的区别

如何在PySide/Qt QColumbnView中删除列

在不同的帧B中判断帧A中的子字符串,每个帧的大小不同

比Pandas 更好的 Select

在极点中读取、扫描和接收有什么不同?

在Django中重命名我的表后,旧表中的项目不会被移动或删除

每次查询的流通股数量

如何获得满足掩码条件的第一行的索引?

文本溢出了Kivy的视区

Stats.ttest_ind:提取df值

如何在Python中实现高效地支持字典和堆操作的缓存?

对包含JSON列的DataFrame进行分组

打印:添加具有不同填充 colored颜色 的矩形

如果init被重载,如何输入提示一个基于init的函数的返回类型

在每个子列表(2D列表)中返回2个以上的重复项