Pandas处理百万级DataFrame:筛选连续符合条件行的问题求助
DataFrame按条件筛选连续符合要求的行并导出CSV
问题描述
我有一个包含300万条记录的DataFrame,包含A列和作为数据采集时间戳的B列,需按以下条件拆分处理:
- 按A列分组后,丢弃成员数少于3的组;
- 仅保留同一A列值下,B列时间戳小于7秒且连续记录数超过4的行,并保存为CSV文件。
现有代码能满足第一个条件,但第二个条件存在问题:当前代码会保存整个符合条件的分组,而非仅保存连续满足条件的目标行(如示例中仅需保存N组的最后5条连续符合条件的行)。
示例数据
| Column A | Column B |
|---|---|
| D | 3 |
| A | 2 |
| A | 2 |
| A | 8 |
| A | 13 |
| C | 15 |
| D | 8 |
| D | 6 |
| F | 3 |
| F | 14 |
| F | 2 |
| F | 5 |
| F | 2 |
| G | 20 |
| B | 12 |
| N | 15 |
| N | 1 |
| N | 2 |
| N | 1 |
| N | 2 |
| N | 3 |
现有代码
# 过滤A列出现次数少于4次的记录 grouped = df.groupby('A') for i in grouped.groups.keys(): p = grouped.get_group(i) if len(p.index)>3: # 过滤B列值小于6的记录 y= [len(list(g)) for k, g in groupby(p['Column B']<6) if k==True] if len(y) !=0: if max(y)>4: p.to_csv('D:/TEST1/'f"{i}.csv", sep=';')
解决方案
核心是识别每个分组中连续满足B<7的片段,筛选出长度超过4的片段后仅导出这些行,修改后的代码如下:
import pandas as pd from itertools import groupby # 假设数据已加载到df中 # df = pd.read_csv("your_source_data.csv") # 第一步:过滤掉A列分组成员数少于3的组 filtered_groups = df.groupby('A').filter(lambda x: len(x) >= 3) # 第二步:遍历每个有效分组,筛选连续符合条件的行 for a_value, group in filtered_groups.groupby('A'): # 标记当前行是否满足B<7的条件 group['is_valid'] = group['Column B'] < 7 # 生成连续有效片段的分组ID:当is_valid状态变化时,ID加1 group['segment_id'] = (group['is_valid'] != group['is_valid'].shift()).cumsum() # 筛选出全为有效状态且长度超过4的片段 valid_rows = group.groupby('segment_id').filter( lambda seg: seg['is_valid'].all() and len(seg) > 4 ) # 如果存在符合条件的行,导出到CSV if not valid_rows.empty: # 可选:删除临时添加的is_valid和segment_id列 valid_rows = valid_rows.drop(columns=['is_valid', 'segment_id']) valid_rows.to_csv(f'D:/TEST1/{a_value}.csv', sep=';', index=False)
代码说明
- 高效分组过滤:用
groupby.filter直接过滤掉成员数不足3的分组,比循环遍历分组更适合处理300万条数据; - 连续片段识别:通过对比当前行与上一行的
is_valid状态,生成连续片段的ID,以此区分不同的连续块; - 精准筛选片段:对每个片段检查是否全为有效行且长度超过4,只保留这些片段的行;
- 导出优化:导出时可以删除临时添加的辅助列,保证输出CSV的简洁性。
以示例中的N组为例,代码会仅保留最后5条连续满足B<7的行并导出,其他不符合条件的行(如N组第一条B=15的记录)会被丢弃。
内容的提问来源于stack exchange,提问作者Asa Ya
相关产品推荐
相关产品推荐

