我有一个pandas dataframe,它表示几个目标涡轮机的每10度点之间的高程差。我选择了遵循某个条件的高程差,并添加了一列来表示这些高程差是否连续(metDegDiff = 10表示连续点)。
如何通过targTurb在3个或更多连续的10度点中选择elevDif的最大值?
ridgeDF2 = pd.DataFrame(data = {
'MetID':['A06_40','A06_50','A06_60','A06_70','A06_80','A06_100','A06_110','A06_140','A07_110','A07_130','A07_140','A08_100','A08_110','A08_120','A08_130','A08_220'],
'targTurb':['A06','A06','A06','A06','A06','A06','A06','A06','A07','A07','A07','A08','A08','A08','A08','A08'],
'metDeg':[30,50,60,70,80,100,110,140,110,130,140,100,110,120,130,220],
'elevDif':[1.433234, 1.602997,3.227997,2.002991,2.414001,2.96402,1.513,1.793976,1.612,2.429993,1.639008,1.500977,3.048004,2.174011,1.813995,1.527008],
'metDegDiff':[20,10,10,10,10,20,10,30,-30,20,10,-40,10,10,10,30]})
[Dbg]>>> ridgeDF2
MetID targTurb metDeg elevDif metDegDiff
0 A06_40 A06 30 1.433234 20
1 A06_50 A06 50 1.602997 10
2 A06_60 A06 60 3.227997 10
3 A06_70 A06 70 2.002991 10
4 A06_80 A06 80 2.414001 10
5 A06_100 A06 100 2.964020 20
6 A06_110 A06 110 1.513000 10
7 A06_140 A06 140 1.793976 30
8 A07_110 A07 110 1.612000 -30
9 A07_130 A07 130 2.429993 20
10 A07_140 A07 140 1.639008 10
11 A08_100 A08 100 1.500977 -40
12 A08_110 A08 110 3.048004 10
13 A08_120 A08 120 2.174011 10
14 A08_130 A08 130 1.813995 10
15 A08_220 A08 220 1.527008 30
在该示例中,对于A06,存在具有连续10个metDeg值的4行(行1、2、3和4),并且对于A8,存在3行(行12、13和14)。请注意,这2个系列的长度为3或更长。
因此,输出将是这两个所选系列内的最大elevDif。就像这样:
MetID targTurb metDeg elevDif metDegDiff
A06_60 A06 60 3.227997 10
A08_110 A08 110 3.048004 10
3条答案
按热度按时间wgx48brx1#
下面的代码应该可以工作。您可以单独运行每一行,看看发生了什么。
或
sulc1iza2#
链式解
分步解决方案
.cumsum()
metDegDiff
创建第一个元素不为10的组。应用多重过滤器以去除上面生成的组中不等于10的
metDegDiff
,并保留连续值计数=10等于或大于3的组。我链接groupby()
、.transform()
和布尔选择来实现这一点从上面剩余的内容中,选择具有最大值的索引
结果
定时
m3eecexj3#
您可以做的是使用
shift
和cumsum
为metDegDiff和相同targTurb中的相同连续值创建一个组列。然后,您可以使用此组列来选择组中具有大于或等于(ge
)3个值的位置,这些值是通过组号的map
与组号的value_counts
获得的,并且metDegDiff中的值等于(eq
)10。现在只有感兴趣的组,可以在elevDif上使用sort_values
,在group列上使用drop_duplicates
,以保持每组的最大值。如果需要的话,可以使用drop
列gr和sort_values
per targTurb结束。你就能得到你想要的行