Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas pd.df使用groupby成对查找行并更改伪值_Pandas_Pandas Groupby_Python 3.8 - Fatal编程技术网

Pandas pd.df使用groupby成对查找行并更改伪值

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

我的pd.DataFrame看起来像这个示例,但有大约10mio行,因此我正在寻找一个有效的解决方案

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]