Python 3.x 如何根据pd.DataFrame中另一列中满足的条件来查找行之间的最高值和最低值?
我有以下数据帧,每次运行脚本时都会生成,数据帧如下所示:Python 3.x 如何根据pd.DataFrame中另一列中满足的条件来查找行之间的最高值和最低值?,python-3.x,pandas,dataframe,Python 3.x,Pandas,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
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
提前感谢所有人的帮助和支持。您可以对状态相同的数据帧的连续值执行
groupby
,按值对每个分组的数据帧进行排序,并根据分组数据帧的状态
是否等于X
或Y
,保留排序数据帧的第一个或最后一个值
注意:我注意到数据框的time
列对答案没有影响,所以我在重新创建数据框时没有包括它
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
给定的X,Y的最低/最高值是多少?Y的最小值为2,X的最大值为11,而状态为==到Y时Y的最小值,一旦代码在状态列上找到X,它将开始查找最大值。然后用找到的每个值创建一个新的数据框。谢谢你的帮助,你帮了我很多忙。没问题,很高兴能帮上忙!