如何根据pd.DataFrame中另一列中满足的条件,找到行之间的最高值和最低值



我有以下DataFrame,它是每次运行脚本时生成的,DataFrame如下所示:

df=

index            time    value  status
0  2020-11-20 20:10:00   10        X
1  2020-11-20 20:20:00   11        X
2  2020-11-20 20:45:00   9         X 
3  2020-11-20 20:45:00   5         Y
4  2020-11-20 21:00:00   4         X
5  2020-11-20 21:05:00   2         Y
6  2020-11-20 21:15:00   4         Y
7  2020-11-20 21:20:00   9         X
8  2020-11-20 21:25:00   5         X
The desired output would be :
index            time    value  status
0  2020-11-20 20:20:00   11        X
1  2020-11-20 20:45:00   5         Y
2  2020-11-20 21:00:00   4         X
3  2020-11-20 21:05:00   2         Y
4  2020-11-20 21:20:00   9         X

因此,我的目标是创建一个新的pd.DataFrame,其中Y的值最低,X的值最高。

提前感谢大家的协助和支持。

您可以对状态相同的DataFrame的连续值执行groupby,按value对每个分组的DataFrame进行排序,并根据分组的DataFrame的status是否等于XY来保留排序后的DataFrame中的第一个或最后一个值。

注意:我注意到DataFrame的time列对答案没有影响,所以我在重新创建DataFrame时没有包括它。

import pandas as pd
## the time column doesn't matter in your problem
df = pd.DataFrame({
'value':[10,11,9,5,4,2,4,9,5],
'status':['X']*3+['Y']+['X']+['Y']*2+['X']*2
})
df_new = pd.DataFrame(columns=df.columns)
## perform a groupby on consecutive values
for _, g in df.groupby([(df.status != df.status.shift()).cumsum()]):
g = g.sort_values(by='value')
## keep the highest value for X
if g.status.values[0] == 'X':
g = g.drop_duplicates(subset=['status'], keep='last')
## keep the lowest value for Y
elif g.status.values[0] == 'Y':
g = g.drop_duplicates(subset=['status'], keep='first')
else:
pass
df_new = pd.concat([df_new, g])
df_new = df_new.reset_index(drop=True)

输出:

>>> df_new
value status
0    11      X
1     5      Y
2     4      X
3     2      Y
4     9      X

最新更新