如何在Python中筛选具备全周期数据的DataFrame个体?
Python实现筛选完整周期数据的解决方案
当然可以实现,以下是基于pandas库的两种常用解决方法:
方法一:直接校验年份集合
通过分组后检查每个id的年份是否包含全部目标年份(2019、2020、2021):
import pandas as pd # 构造原始DataFrame df = pd.DataFrame({ 'id': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C'], 'year': [2019, 2020, 2021, 2019, 2020, 2021, 2020, 2021], 'gdp': [3, 0, 5, 4, 2, 1, 5, 4] }) # 定义需要覆盖的完整年份集合 required_years = {2019, 2020, 2021} # 筛选出拥有完整年份的id valid_ids = df.groupby('id')['year'].apply( lambda x: required_years.issubset(x.unique()) ).loc[lambda x: x].index # 过滤得到结果 result = df[df['id'].isin(valid_ids)] print(result)
方法二:通过年份数量校验
先过滤掉不在目标年份范围内的记录,再统计每个id的唯一年份数是否为3(适用于已知目标年份数量的场景):
import pandas as pd df = pd.DataFrame({ 'id': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C'], 'year': [2019, 2020, 2021, 2019, 2020, 2021, 2020, 2021], 'gdp': [3, 0, 5, 4, 2, 1, 5, 4] }) required_years = {2019, 2020, 2021} # 先过滤年份,再统计每个id的唯一年份数 filtered_year_df = df[df['year'].isin(required_years)] valid_ids = filtered_year_df.groupby('id')['year'].nunique() == 3 valid_ids = valid_ids[valid_ids].index result = df[df['id'].isin(valid_ids)] print(result)
两种方法都能得到你需要的结果,其中方法一逻辑更严谨,可直接确保包含所有必要年份;方法二则更简洁,适合明确目标年份数量的场景。
内容的提问来源于stack exchange,提问作者maxst
相关产品推荐
相关产品推荐

