Pandas pd.df使用groupby成对查找行并更改伪值
我的pd.DataFrame看起来像这个示例,但有大约10mio行,因此我正在寻找一个有效的解决方案Pandas pd.df使用groupby成对查找行并更改伪值,pandas,pandas-groupby,python-3.8,Pandas,Pandas Groupby,Python 3.8,我的pd.DataFrame看起来像这个示例,但有大约10mio行,因此我正在寻找一个有效的解决方案 import pandas as pd df = pd.DataFrame({'timestamp':['2004-09-06', '2004-09-06', '20
import pandas as pd
df = pd.DataFrame({'timestamp':['2004-09-06', '2004-09-06', '2004-09-06', '2004-09-06', '2004-09-07', '2004-09-07'],
'opt_expiry': ['2005-12-16', '2005-12-16', '2005-12-16', '2005-12-16', '2005-06-17', '2005-06-17'],
'strike': [2, 2, 2.5, 2.5, 1.5, 1.5],
'type': ['c', 'p', 'c', 'p', 'c', 'p'],
'sigma': [0.25, 0.25, 0.001, 0.17, 0.195, 0.19],
'delta': [0.7, -0.3, 1, -0.25, 0.6, -0.4]}).set_index('timestamp', drop=True)
df.index = pd.to_datetime(df.index)
df.opt_expiry = pd.to_datetime(df.opt_expiry)
Out[2]:
opt_expiry strike type sigma delta
timestamp
2004-09-06 2005-12-16 2.0 c 0.250 0.70
2004-09-06 2005-12-16 2.0 p 0.250 -0.30
2004-09-06 2005-12-16 2.5 c 0.001 1.00
2004-09-06 2005-12-16 2.5 p 0.170 -0.25
2004-09-07 2005-06-17 1.5 c 0.195 0.60
2004-09-07 2005-06-17 1.5 p 0.190 -0.40
以下是我希望实现的目标:
1找到具有相同时间戳、opt_到期和罢工的对:
groups = df.groupby(['timestamp','opt_expiry','strike'])
2对于每组,检查绝对增量之和是否等于1。如果为true,则找到两个sigma值中的最大值,并将其作为新的、正确的sigma分配给两行。伪代码:
for group in groups:
# if sum of absolute deltas != 1
if (abs(group.delta[0]) + abs(group.delta[1])) != 1:
correct_sigma = group.sigma.max()
group.sigma = correct_sigma
预期产出:
opt_expiry strike type sigma delta
timestamp
2004-09-06 2005-12-16 2.0 c 0.250 0.70
2004-09-06 2005-12-16 2.0 p 0.250 -0.30
2004-09-06 2005-12-16 2.5 c 0.170 1.00
2004-09-06 2005-12-16 2.5 p 0.170 -0.25
2004-09-07 2005-06-17 1.5 c 0.195 0.60
2004-09-07 2005-06-17 1.5 p 0.190 -0.40
修改后的答案。我相信会有一个简短的答案。也许把它当作赏金吧 资料 工作 每组每行的绝对增量和
df['absdelta']=df['delta'].abs()
新数据帧df2中每组的绝对增量和和和最大西格玛
将df2与df合并
总和绝对增量不等于1的掩码组
m=df3['absdelta_right']!=1
m
使用蒙版,将最大西格玛应用于上面蒙版的组中的实体
df3.loc[m,'sigma']=df3.loc[m,'sigma_right']
切片以返回到原始数据帧
df3.iloc[:,:-4]
输出
. 我认为一个小的输入列+一些记录和预期的df更容易理解。@steff我做了一次尝试。我不确定一切都对了。如果我不让我知道。愿意recode@wwnde. 谢谢你。正在检查。刚刚进行了编辑,使用==1代替了=1@DanilaGanchar完成。用可重新生成的DfHanks编辑了该问题。但这不是我所需要的。对于每一对,我需要用较高的值替换较小的sigma。您的函数指定整个df的最高西格玛。例如df.iloc[-1].sigma是0.152608。需要分配给df.iloc[-1].sigma,即0.001。对不起,如果我之前不清楚…你说的高值是什么意思?什么/哪个值更高?我们可以在它周围找到我们发现的每一组都有c型和p型。如果绝对增量不等于1,则其中一个西格玛值错误,需要替换。错误的值通常是较低的值。因此,我想为两者都指定更高的值。希望这能澄清。请参阅我的编辑。那么,我相信==1的任何函数都会保持它的sigma?谢谢。明天我们需要看看这个。将尽快恢复。
m=df3['absdelta_right']!=1
m
df3.loc[m,'sigma']=df3.loc[m,'sigma_right']
df3.iloc[:,:-4]