如何在Pandas中为连续Apple分组求最大值?为何Banana行Max为90?
问题解答
一、Banana行Max为90的原因
原代码的条件判断逻辑存在优先级问题:
condition=(df['Fruits']=="Apple")&(df['Fruits'].shift(-1)=="Apple")|(df['Fruits'].shift(1)=="Apple")
Python中&的优先级高于|,这个条件实际等价于:(当前行是Apple且下一行是Apple) OR (上一行是Apple)
Banana所在的行(索引2)的上一行是Apple(索引1),因此满足df['Fruits'].shift(1)=="Apple"的条件,被纳入了condition范围。之后代码将所有满足condition的行的Max赋值为这些行中Price的最大值——也就是所有符合条件行里的最高Price(90,来自索引5的Apple),所以Banana的Max被设为90。
二、实现需求的代码
要实现连续Apple组内的Max为组内Price最大值,非Apple组Max为0的效果,可以通过标记连续分组+分组求最大值的方式实现,无需循环:
import pandas as pd data = { 'Fruits': ['Apple', 'Apple', 'Banana', 'Orange', 'Apple', 'Apple'], 'Price': [20, 30, 50, 170, 55, 90] } df = pd.DataFrame(data) # 标记连续的组:非Apple的行触发分组切换 df['group'] = (df['Fruits'] != 'Apple').cumsum() # 计算每个组的Price最大值,仅保留Apple组的最大值,其他组设为0 df['Max'] = df.groupby('group')['Price'].transform(lambda x: x.max() if x.name in df[df['Fruits']=='Apple']['group'].unique() else 0) # 不需要group列的话可以删除 df = df.drop('group', axis=1) print(df)
运行结果
Fruits Price Max 0 Apple 20 30.0 1 Apple 30 30.0 2 Banana 50 0.0 3 Orange 170 0.0 4 Apple 55 90.0 5 Apple 90 90.0
代码说明
(df['Fruits'] != 'Apple').cumsum():每当遇到非Apple的行,累加值+1,这样连续的Apple会被分到同一个组号里,比如前两个Apple组号为0,Banana和Orange组号为1、2,最后两个Apple组号为3。groupby('group')['Price'].transform(...):对每个组计算Price的最大值,仅当组内有Apple时保留最大值,否则设为0,保证非Apple行的Max为0。
内容的提问来源于stack exchange,提问作者Starlord
相关产品推荐
相关产品推荐

