如何按组保留从指定值到组内最大值的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
相关产品推荐
相关产品推荐

