You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

代码说明

  1. (df['Fruits'] != 'Apple').cumsum():每当遇到非Apple的行,累加值+1,这样连续的Apple会被分到同一个组号里,比如前两个Apple组号为0,Banana和Orange组号为1、2,最后两个Apple组号为3。
  2. groupby('group')['Price'].transform(...):对每个组计算Price的最大值,仅当组内有Apple时保留最大值,否则设为0,保证非Apple行的Max为0。

内容的提问来源于stack exchange,提问作者Starlord

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 00:36:03