如何在Pandas中对含跨年日序的两列数据进行排序
解决方案:自定义规则排序并填充缺失行
需求说明
现有一组按day_of_year和year记录的数据,每年day_of_year=1时切换至新年份。需要按以下规则处理:
- 2017年仅保留并排序
364、365日期的数据 - 2018及以后年份按
1、2、364、365的顺序排列数据 - 排序完成后添加两行全为
n/a的缺失数据
原始数据
day_of_year year var_1 364 2017 17.71666667 364 2018 5.166666667 364 2019 2 364 2020 1.595833333 364 2021 3.75 364 2022 6.8875 365 2017 14.83333333 365 2018 2.758333333 365 2019 4.108333333 365 2020 5.766666667 365 2021 5.291666667 365 2022 10.58636364 1 2017 2.0125 1 2018 14.0125 1 2019 -0.504166667 1 2020 7.666666667 1 2021 5.520833333 1 2022 1.229166667 2 2017 1.7625 2 2018 15.10416667 2 2019 -0.391666667 2 2020 9.5 2 2021 7.645833333 2 2022 0.9125
目标结果
day_of_year year var_1 364 2017 17.71666667 365 2017 14.83333333 1 2018 14.0125 2 2018 15.10416667 364 2018 5.166666667 365 2018 2.758333333 1 2019 -0.504166667 2 2019 -0.391666667 364 2019 2 365 2019 4.108333333 1 2020 7.666666667 2 2020 9.5 364 2020 1.595833333 365 2020 5.766666667 1 2021 5.520833333 2 2021 7.645833333 364 2021 3.75 365 2021 5.291666667 1 2022 1.229166667 2 2022 0.9125 364 2022 6.8875 365 2022 10.58636364 n/a n/a n/a n/a n/a n/a
Python(Pandas)实现代码
步骤1:导入依赖并加载数据
import pandas as pd from io import StringIO # 读取原始数据 raw_data = """day_of_year year var_1 364 2017 17.71666667 364 2018 5.166666667 364 2019 2 364 2020 1.595833333 364 2021 3.75 364 2022 6.8875 365 2017 14.83333333 365 2018 2.758333333 365 2019 4.108333333 365 2020 5.766666667 365 2021 5.291666667 365 2022 10.58636364 1 2017 2.0125 1 2018 14.0125 1 2019 -0.504166667 1 2020 7.666666667 1 2021 5.520833333 1 2022 1.229166667 2 2017 1.7625 2 2018 15.10416667 2 2019 -0.391666667 2 2020 9.5 2 2021 7.645833333 2 2022 0.9125""" df = pd.read_csv(StringIO(raw_data), sep=r'\s+')
步骤2:筛选有效行并自定义排序
# 过滤2017年的1、2号数据 df_filtered = df[~((df['year'] == 2017) & (df['day_of_year'].isin([1,2])))] # 生成排序键,控制年份内的日期顺序 def get_sort_key(row): if row['year'] == 2017: return (row['year'], row['day_of_year']) else: # 把1、2归为第一组,364、365归为第二组,实现指定顺序 group = 0 if row['day_of_year'] in [1,2] else 1 return (row['year'], group, row['day_of_year']) # 按自定义键排序 df_sorted = df_filtered.sort_values(by=df_filtered.apply(get_sort_key, axis=1))
步骤3:添加缺失行并输出结果
# 创建两行n/a数据 na_rows = pd.DataFrame({ 'day_of_year': ['n/a', 'n/a'], 'year': ['n/a', 'n/a'], 'var_1': ['n/a', 'n/a'] }) # 合并数据 final_df = pd.concat([df_sorted, na_rows], ignore_index=True) # 打印最终结果 print(final_df.to_string(index=False))
内容的提问来源于stack exchange,提问作者user2100039
相关产品推荐
相关产品推荐

