如何使用pandas操作数组中的数据(以及重置计算)

如何使用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与作为浮点型值结果的设定点进行比较的所需逻

为了清晰起见,我已经修改了这个问题,并删除了工件和不一致的地方——请重新开放供社区考虑。一位投稿人已经认为groupby与cummax的结合可能会有一个解决方案

我有一个数据帧,其中col3的先前值和col2的当前值之间的最大值通过Scott Boston最近提供的cummax函数进行计算,谢谢!详情如下:

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的下限内的本地最大标识