我有以下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
是否等于X
或Y
来保留排序后的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