基于日期条目数筛选Pandas DataFrame:删除条目不足的行
问题描述
我有如下结构的Pandas DataFrame:
| Date_Time | level |
|---|---|
| 2018-02-12 13:22:27 | 5 |
| 2018-02-12 13:17:27 | 7 |
| 2018-02-12 13:12:27 | 2 |
| 2018-02-12 13:07:27 | 6 |
| 2018-02-13 13:12:27 | 4 |
| 2018-02-13 13:17:27 | 5 |
需求:若某一日期对应的条目数少于3条,则删除该日期的所有行。示例中2018-02-13仅有2条数据,移除后得到目标DataFrame:
| Date_Time | level |
|---|---|
| 2018-02-12 13:22:27 | 5 |
| 2018-02-12 13:17:27 | 7 |
| 2018-02-12 13:12:27 | 2 |
| 2018-02-12 13:07:27 | 6 |
之前用for循环实现,但运行耗时过长,寻求更高效的解决方案。
高效解决方案
Pandas的向量化操作远优于循环,以下两种方法可以高效实现需求:
方法1:分组统计后过滤
先从Date_Time提取日期,通过groupby.transform计算每个日期的条目数,再筛选出条目数≥3的行:
import pandas as pd # 假设你的DataFrame名为df df['date'] = pd.to_datetime(df['Date_Time']).dt.date # 为每行添加对应日期的条目数 date_counts = df.groupby('date')['date'].transform('count') # 过滤并删除临时列 result_df = df[date_counts >= 3].drop('date', axis=1)
方法2:筛选有效日期后匹配
先提取日期,用value_counts获取符合条件的日期列表,再保留这些日期对应的行:
import pandas as pd df['date'] = pd.to_datetime(df['Date_Time']).dt.date # 获取条目数≥3的日期 valid_dates = df['date'].value_counts()[lambda x: x >= 3].index # 筛选行并删除临时列 result_df = df[df['date'].isin(valid_dates)].drop('date', axis=1)
这两种方法均利用Pandas内置的向量化计算,处理大数据集时效率会比for循环提升显著。
内容的提问来源于stack exchange,提问作者Shawn Mian
相关产品推荐
相关产品推荐

