pandas Python Dataframe :满足条件后更新行值,并保持更新,直到另一个条件不为false

ttisahbt  于 2023-01-04  发布在  Python
关注(0)|答案(1)|浏览(151)

我有一个 Dataframe ,我想添加另一列,其中包含某些值,这些值在BH为yes之后在行上更新,并在日期更改之前一直更新
要输入的值是CP和DP的差值

Date        CP      DP      BH
2/9/2016    122.2   122.13
2/9/2016    122 122.13  
2/9/2016    122.35  122.13
2/9/2016    122.85  122.13  Yes
2/9/2016    122.75  122.13
2/9/2016    122.95  122.13  
2/9/2016    123     122.13  
2/10/2016   123.65  122.12  
2/10/2016   123.19  122.12  
2/10/2016   122.45  122.12  Yes
2/10/2016   121.85  122.12  
2/10/2016   121.75  122.12  
2/10/2016   121.35  122.12

预期的输出为

Date        CP      DP      BH  Distance
2/9/2016    122.2   122.13      
2/9/2016    122 122.13      
2/9/2016    122.35  122.13      
2/9/2016    122.85  122.13  Yes 
2/9/2016    122.75  122.13      0.62
2/9/2016    122.95  122.13      0.82
2/9/2016    123     122.13      0.87
2/10/2016   123.65  122.12      
2/10/2016   123.19  122.12      
2/10/2016   122.45  122.12  Yes 
2/10/2016   121.85  122.12      -0.27
2/10/2016   121.75  122.12      -0.37
2/10/2016   121.35  122.12      -0.77

所以基本上,在BH为yes之后,相同日期的所有行的距离都更新了,每个日期都做了相同的操作。我在 Dataframe 中有超过2000000条记录。
我已经能够使用np. where将BH更新为yes,但是无法解决更新距离列的问题。考虑到我拥有的数据量,我正在努力避免循环,有什么建议吗

afdcj2ne

afdcj2ne1#

将列BHSeries.eq进行比较,然后与GroupBy.cummax进行比较,得到每组匹配后的所有True,最后减去过滤的行,得到新列Distance

m = df['BH'].eq('Yes')
mask = m.groupby(df['Date']).cummax() & ~m

df['Distance'] = df.loc[mask, 'CP'].sub(df.loc[mask, 'DP'])
print (df)
         Date      CP      DP   BH  Distance
0    2/9/2016  122.20  122.13  NaN       NaN
1    2/9/2016  122.00  122.13  NaN       NaN
2    2/9/2016  122.35  122.13  NaN       NaN
3    2/9/2016  122.85  122.13  Yes       NaN
4    2/9/2016  122.75  122.13  NaN      0.62
5    2/9/2016  122.95  122.13  NaN      0.82
6    2/9/2016  123.00  122.13  NaN      0.87
7   2/10/2016  123.65  122.12  NaN       NaN
8   2/10/2016  123.19  122.12  NaN       NaN
9   2/10/2016  122.45  122.12  Yes       NaN
10  2/10/2016  121.85  122.12  NaN     -0.27
11  2/10/2016  121.75  122.12  NaN     -0.37
12  2/10/2016  121.35  122.12  NaN     -0.77

相关问题