如何使用pandas操作数组中的数据(以及重置计算)
为了清晰起见,我已经修改了这个问题,并删除了工件和不一致的地方——请重新开放供社区考虑。一位投稿人已经认为groupby与cummax的结合可能会有一个解决方案 我有一个数据帧,其中col3的先前值和col2的当前值之间的最大值通过Scott Boston最近提供的cummax函数进行计算,谢谢!详情如下:如何使用pandas操作数组中的数据(以及重置计算),pandas,dataframe,python-3.6,Pandas,Dataframe,Python 3.6,为了清晰起见,我已经修改了这个问题,并删除了工件和不一致的地方——请重新开放供社区考虑。一位投稿人已经认为groupby与cummax的结合可能会有一个解决方案 我有一个数据帧,其中col3的先前值和col2的当前值之间的最大值通过Scott Boston最近提供的cummax函数进行计算,谢谢!详情如下: df['col3'] = df['col2'].shift(-1).cummax().shift(). 产生的数据帧如下所示。还添加了将col2与作为浮点型值结果的设定点进行比较的所需逻
df['col3'] = df['col2'].shift(-1).cummax().shift().
产生的数据帧如下所示。还添加了将col2与作为浮点型值结果的设定点进行比较的所需逻辑
运行cummax的结果:
col0 col1 col2 col3
0 1 5.0 2.50 NaN
1 2 4.9 2.45 2.45
2 3 5.5 2.75 2.75
3 4 3.5 1.75 2.75
4 5 3.1 1.55 2.75
5 6 4.5 2.25 2.75
6 7 5.5 2.75 2.75
7 8 1.2 0.6 2.75
8 9 5.8 2.90 2.90
在上述示例中,当col3>=设定点或2.71时,需要标记为True,以便每次col3的最新行超过设定点时
问题:当达到设定点时,cummax解决方案不会复位。需要一个解决方案,每当cummax计算超出设定点时,该解决方案将重置cummax计算。例如,在上表中,当col3超过设定点时,第一次为真后,即col2值为2.75,第二次应满足相同条件,即如扩展数据表中所示,其中我删除了第4行中的col3值,以说明需要在if语句中“重置”cummax calc,我使用下标[-1]来定位df中的最后一行,即最近的一行。注:col2=col1*constant1的当前值,其中constant1==0.5
迄今为止尝试的代码请注意col3未正确重置:
if self.constant is not None: setpoint = self.constant * (1-self.temp) # suppose setpoint == 2.71
df = pd.DataFrame({'col0':[1,2,3,4,5,6,7,8,9]
,'col1':[5,4.9,5.5,3.5,3.1,4.5,5.5,1.2,5.8]
,'col2':[2.5,2.45,2.75,1.75,1.55,2.25,2.75,0.6,2.9]
,'col3':[NaN,2.45,2.75,2.75,2.75,2.75,2.75,2.75,2.9]
})
if df[‘col3’][-1] >= setpoint:
self.log(‘setpoint hit')
return True
Cummax解决方案需要调整:col3应评估col2和col3的基础值,一旦col3的设定点超过2.71,下一个col3值应重置为NaN并启动新的Cummax。col3的正确输出应为:[NaN,2.45,2.75,NaN,1.55,2.25,2.75,NaN,2.9],当col3的最后一行超出设定值2.71时,应反复返回True
使用引用col2?的groupby对col3进行操作cummax和额外调整的预期结果:每次违反设定点时返回True。下面是结果col3的一个示例:
col0 col1 col2 col3
0 1 5.0 2.50 NaN
1 2 4.9 2.45 2.45
2 3 5.5 2.75 2.75
3 4 3.5 1.75 NaN
4 5 3.1 1.55 1.55
5 6 4.5 2.25 2.25
6 7 5.5 2.75 2.75
7 8 1.2 0.60 NaN
8 9 5.8 2.90 2.90
对于违反发生的行或如上所示的下一行是否返回NaN的建议,我们持开放态度。关键的愿望是,一旦违反设定点,if语句将立即解析为True 试试看:
import pandas as pd
import numpy as np
df = pd.DataFrame({'col0':[1,2,3,4,5,6,7,8,9]
,'col1':[5,4.9,5.5,3.5,3.1,4.5,5.5,1.2,5.8]
,'col2':[2.5,2.45,2.75,1.75,1.55,2.25,2.75,0.6,2.9]
,'col3':[np.nan,2.45,2.75,2.75,2.75,2.75,2.75,2.75,2.9]
})
threshold = 2.71
grp = df['col2'].ge(threshold).cumsum().shift().bfill()
df['col3'] = df['col2'].groupby(grp).transform(lambda x: x.shift(-1).cummax().shift())
print(df)
输出:
col0 col1 col2 col3
0 1 5.0 2.50 NaN
1 2 4.9 2.45 2.45
2 3 5.5 2.75 2.75
3 4 3.5 1.75 NaN
4 5 3.1 1.55 1.55
5 6 4.5 2.25 2.25
6 7 5.5 2.75 2.75
7 8 1.2 0.60 NaN
8 9 5.8 2.90 2.90
详情:
使用大于或等于阈值创建分组,然后使用groupby with transform将相同的逻辑应用于数据帧中的每个组withn。Scott,谢谢。作品我可能会问一个问题:我需要一个if语句根据上面的描述返回true,以检查最新的rowdf['col2'].gethresholddf['grp']=grp.diff-1.eq-1 df['grp']=grp.diff-1.eq-1感谢Scott。还有一个问题贴在这里。问题主题:设置为%trigger True的下限内的本地最大标识