基于Pandas按Event_Number分组筛选p_and_s>2的Well值
处理大型Pandas DataFrame:按分组筛选符合条件的列值
针对你这个包含50万+行的大型DataFrame需求,我来分享几个高效且实用的解决方案,兼顾性能和可读性:
先明确你的需求和样本数据
你需要按Event_Number分组,提取每组中p_and_s大于2对应的Well值。先把你给出的样本数据用代码还原出来,方便测试:
import pandas as pd data = { 'Event_Number': [1,1,1,2,2,2,3,3,3,4,4,5,5,5,6,6,7,7,7,8,8], 'Well': [7,9,15,7,9,15,5,7,16,7,15,7,9,15,5,7,7,9,15,7,15], 'p_and_s': [4.0,0.0,0.0,2.0,7.0,0.0,0.0,8.0,3.0,8.0,0.0,8.0,3.0,6.0,0.0,8.0,8.0,0.0,0.0,8.0,4.0] } df = pd.DataFrame(data)
方案1:先过滤再分组(强烈推荐,性能最优)
因为你的数据量很大,提前过滤不符合条件的行能大幅减少后续分组的计算量,这是处理大数据集的核心思路之一。
步骤很简单:
- 先用布尔索引筛选出
p_and_s > 2的所有行 - 再按
Event_Number分组,按需整理结果
# 第一步:过滤符合条件的行 filtered_rows = df[df['p_and_s'] > 2] # 如果你需要保留完整的DataFrame结构(包含所有列),直接重置索引即可 target_df = filtered_rows.reset_index(drop=True) # 如果你只需要每组对应的Well值列表,用聚合函数 wells_per_event = filtered_rows.groupby('Event_Number')['Well'].agg(list)
针对样本数据,target_df的输出如下:
Event_Number Well p_and_s 0 1 7 4.0 1 2 9 7.0 2 3 7 8.0 3 3 16 3.0 4 4 7 8.0 5 5 7 8.0 6 5 9 3.0 7 5 15 6.0 8 6 7 8.0 9 7 7 8.0 10 8 7 8.0 11 8 15 4.0
方案2:分组后逐组过滤(适合复杂逻辑)
如果你的需求后续有扩展,比如每组内需要更复杂的判断逻辑,可以用groupby().apply()来实现。不过要注意:这种方式性能比方案1差,因为它会逐组处理所有数据,适合数据量相对小或者逻辑复杂的场景。
def get_valid_wells(group): # 每组内筛选p_and_s>2的Well值 return group[group['p_and_s'] > 2]['Well'] # 应用函数并整理结果 result = df.groupby('Event_Number').apply(get_valid_wells).reset_index(name='Well')
一些性能小贴士
- 对于50万+行的数据集,方案1的执行速度至少是方案2的2-3倍,一定要优先考虑。
- 可以用
df.query('p_and_s > 2')替代df[df['p_and_s'] > 2],语法更简洁,性能几乎一致。 - 如果
p_and_s列有缺失值,记得先处理(比如df['p_and_s'].fillna(0, inplace=True)),避免布尔索引出现意外结果。
内容的提问来源于stack exchange,提问作者Khalil Al Hooti
相关产品推荐
相关产品推荐

