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

如何按组保留从指定值到组内最大值的DataFrame行?

解决方法

针对你的需求,这里提供两种高效的实现方式,适配大型Data场景:

方法1:字典映射 + 分组过滤

先将存储key与指定值的元组转换为字典,再通过groupby结合lambda函数完成组内过滤:

import pandas as pd

# 替换为你的实际DataFrame
df = pd.DataFrame({
    'key': [1,1,1,1,1,2,2,2,2,2,2,2],
    'value': [346,349,351,353,355,359,359,360,365,365,366,369]
})

# 将指定值元组转为字典(示例元组:((1,349), (2,365)))
spec_values = dict(((1, 349), (2, 365)))

# 过滤组内value >= 指定值的行
result = df.groupby('key').apply(
    lambda group: group[group['value'] >= spec_values[group.name]]
).reset_index(drop=True)

print(result)

如果你的需求是从第一个出现指定值的位置开始,保留到组尾的所有行(即使后续存在小于指定值的记录),可修改lambda逻辑:

result = df.groupby('key').apply(
    lambda group: group.loc[group[group['value'] == spec_values[group.name]].index[0]:]
).reset_index(drop=True)

方法2:合并辅助列 + 批量过滤(大型数据首选)

这种方法避免了groupby.apply的循环开销,性能更优:

import pandas as pd

# 替换为你的实际DataFrame
df = pd.DataFrame({
    'key': [1,1,1,1,1,2,2,2,2,2,2,2],
    'value': [346,349,351,353,355,359,359,360,365,365,366,369]
})

# 指定值字典转DataFrame
spec_df = pd.DataFrame.from_dict(spec_values, orient='index', columns=['spec_val']).reset_index().rename(columns={'index': 'key'})

# 合并指定值列到原数据
df_merged = df.merge(spec_df, on='key')

# 过滤符合条件的行并清理辅助列
result = df_merged[df_merged['value'] >= df_merged['spec_val']].drop('spec_val', axis=1)

print(result)

两种方法均可得到目标结果,方法2在处理百万级以上数据时效率提升明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:10:46