如何在Pandas DataFrame中筛选2012年存在污染超标的日期
提取2012年空气质量超标的日期
核心思路
先筛选出2012年的数据集,再按日期分组判断该日期是否存在空气质量>150的记录,最后提取符合条件的唯一日期。
实现方法(基于Pandas)
方法1:利用GroupBy + any() 直接筛选
import pandas as pd # 确保Datetime列为datetime类型(原始为字符串时执行) df['Datetime'] = pd.to_datetime(df['Datetime']) # 筛选2012年的数据 df_2012 = df[df['Datetime'].dt.year == 2012] # 按Date分组,判断每组是否存在空气质量>150的记录 high_aq_groups = df_2012.groupby('Date')['Airquality(float)'].apply(lambda x: x.gt(150).any()) # 提取符合条件的日期,转为列表格式 result_dates = high_aq_groups[high_aq_groups].index.tolist()
方法2:用Transform标记后去重
如果需要保留原数据集的其他信息,同时标记日期是否超标,可采用这种方式:
import pandas as pd df['Datetime'] = pd.to_datetime(df['Datetime']) df_2012 = df[df['Datetime'].dt.year == 2012] # 给每行标记其所属日期是否存在超标数据 df_2012['has_high_aq'] = df_2012.groupby('Date')['Airquality(float)'].transform(lambda x: x.gt(150).any()) # 提取所有超标日期并去重 result_dates = df_2012[df_2012['has_high_aq']]['Date'].unique().tolist()
方法3:无需单独Date列,直接从Datetime提取日期
如果不想依赖手动新增的Date列,可直接从Datetime字段提取日期分组:
import pandas as pd df['Datetime'] = pd.to_datetime(df['Datetime']) df_2012 = df[df['Datetime'].dt.year == 2012] # 按Datetime的日期部分分组判断 high_aq_groups = df_2012.groupby(df_2012['Datetime'].dt.date)['Airquality(float)'].apply(lambda x: x.gt(150).any()) # 将日期转为字符串格式(可选) result_dates = [date.strftime('%Y-%m-%d') for date in high_aq_groups[high_aq_groups].index]
说明
- 所有方法都会确保最终得到的日期是唯一的,不会产生重复冗余;
- 如果Date列已经是
datetime.date类型,无需额外转换,直接分组即可; x.gt(150)等价于x > 150,any()用来判断分组内是否至少有一条满足条件的记录。
内容的提问来源于stack exchange,提问作者Bojan
相关产品推荐
相关产品推荐

