如何按日期降序排序Pandas DataFrame并使指定重复列行连续
Pandas DataFrame排序问题:按日期降序且同组行连续排列
问题描述
我需要对Pandas DataFrame按Date列降序排序,同时要求Name和Product列值相同的行连续排列,但当前编写的代码未能得到预期结果。
示例代码
import pandas as pd data = { 'Name': ['John', 'Alice', 'John', 'Bob', 'Alice', 'Bob', 'Alice', 'Bob'], 'Product': ['A', 'B', 'A', 'C', 'B', 'C', 'B', 'C'], 'Release Version': ['1.6', '2.0', '1.5', '3.0', '2.5', '3.2', '2.6', '2.8'], 'Date': ['2022-05-15', '2022-04-20', '2022-05-10', '2022-05-01', '2022-04-25', '2022-05-05', '2022-04-29', '2022-04-27'] } # Create a DataFrame df = pd.DataFrame(data) # Convert the 'Date' column to datetime df['Date'] = pd.to_datetime(df['Date']) # Sort values based on 'Date' in descending order and 'Name', 'Product', 'Release Version' columns df = df.sort_values(['Date', 'Name', 'Product', 'Release Version'], ascending=[False, True, True, False])
当前运行结果
Name Product Release Version Date 0 John A 1.6 2022-05-15 2 John A 1.5 2022-05-10 5 Bob C 3.2 2022-05-05 3 Bob C 3.0 2022-05-01 6 Alice B 2.6 2022-04-29 7 Bob C 2.8 2022-04-27 4 Alice B 2.5 2022-04-25 1 Alice B 2.0 2022-04-20
期望结果
Name Product Release Version Date 0 John A 1.6 2022-05-15 2 John A 1.5 2022-05-10 5 Bob C 3.2 2022-05-05 3 Bob C 3.0 2022-05-01 7 Bob C 2.8 2022-04-27 6 Alice B 2.6 2022-04-29 4 Alice B 2.5 2022-04-25 1 Alice B 2.0 2022-04-20
解决方案
你的核心需求是:先将Name+Product相同的行归为一组,每组内按Date降序排列;同时整个DataFrame按每组的最大Date降序排列,这样同组的行就会连续,且整体按日期从新到旧排列。
修正后的代码
import pandas as pd data = { 'Name': ['John', 'Alice', 'John', 'Bob', 'Alice', 'Bob', 'Alice', 'Bob'], 'Product': ['A', 'B', 'A', 'C', 'B', 'C', 'B', 'C'], 'Release Version': ['1.6', '2.0', '1.5', '3.0', '2.5', '3.2', '2.6', '2.8'], 'Date': ['2022-05-15', '2022-04-20', '2022-05-10', '2022-05-01', '2022-04-25', '2022-05-05', '2022-04-29', '2022-04-27'] } df = pd.DataFrame(data) df['Date'] = pd.to_datetime(df['Date']) # 添加每组的最大日期作为排序辅助列 df['group_max_date'] = df.groupby(['Name', 'Product'])['Date'].transform('max') # 按分组最大日期降序、Name、Product、自身Date降序排序 df = df.sort_values( by=['group_max_date', 'Name', 'Product', 'Date'], ascending=[False, True, True, False] ).drop('group_max_date', axis=1) # 删除辅助列 print(df.reset_index(drop=True))
运行结果
Name Product Release Version Date 0 John A 1.6 2022-05-15 1 John A 1.5 2022-05-10 2 Bob C 3.2 2022-05-05 3 Bob C 3.0 2022-05-01 4 Bob C 2.8 2022-04-27 5 Alice B 2.6 2022-04-29 6 Alice B 2.5 2022-04-25 7 Alice B 2.0 2022-04-20
原理说明
transform('max')会为每个分组的所有行填充该组的最大Date,确保同组行拥有相同的排序基准值;- 排序时先按
group_max_date降序,保证整个组的位置由组内最新的日期决定; - 后续按
Name、Product排序确保同组行连续,最后按自身Date降序保证组内按日期从新到旧排列。
内容的提问来源于stack exchange,提问作者vesuvius
相关产品推荐
相关产品推荐

