如何在Python/Pandas DataFrame中筛选含过期标识的软件全量记录?
筛选存在至少一条Identified=1的软件全量记录
问题场景
现有如下结构的Pandas DataFrame:
| Identified | Software | Version | Date |
|---|---|---|---|
| 0 | Microsoft Office | 2 | 2022-05-25 |
| 0 | Microsoft Office | 1 | 2022-03-21 |
| 0 | Adobe Photoshop | 2 | 2022-04-20 |
| 1 | Adobe Photoshop | 1 | 2021-04-04 |
其中Identified列通过以下代码生成(标记日期早于当前日期一年前的记录为1):
import pandas as pd import datetime as dt dfcheck = pd.read_csv('version-data.csv', encoding='utf8') df = pd.DataFrame(dfcheck) olderdata = dt.date.today() - pd.DateOffset(years=1) df['Identified'] = (df['Date'] <= olderdata).astype(int)
需求:创建新的DataFrame,保留所有存在至少一条Identified=1的软件的全部行,预期输出如下:
| Identified | Software | Version | Date |
|---|---|---|---|
| 0 | Adobe Photoshop | 2 | 2022-04-20 |
| 1 | Adobe Photoshop | 1 | 2021-04-04 |
实现方案
方法一:使用groupby + transform
通过分组判断每个软件是否存在Identified=1的记录,再进行过滤:
# 按Software分组,判断每组是否有至少一个Identified=1的记录 has_identified = df.groupby('Software')['Identified'].transform(lambda x: x.any()) # 筛选符合条件的行 new_df = df[has_identified]
方法二:先提取目标软件列表再过滤
先找出所有存在Identified=1的软件,再用这个列表过滤原DataFrame:
# 获取所有Identified=1的软件名称,去重 target_softwares = df[df['Identified'] == 1]['Software'].unique() # 筛选软件在目标列表中的所有行 new_df = df[df['Software'].isin(target_softwares)]
两种方法都能得到预期结果,小数据量下效率相近;大数据量时,方法二的性能通常更优。
内容的提问来源于stack exchange,提问作者Acuity
相关产品推荐
相关产品推荐

