You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按日期降序排序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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 15:40:03