首页 > 编程问答 >如何使用 group by 对 pandas 数据框进行排序

如何使用 group by 对 pandas 数据框进行排序

时间:2024-07-29 12:57:44浏览次数:11  
标签:python pandas

我正在处理类似于下面示例的数据框:

import pandas as pd
import numpy as np

np.random.seed(0)
np.random.seed(0)
df = pd.DataFrame({'date' : np.tile(['2024-05-01', '2024-06-01'], 4),
                  'State' : np.repeat(['fl', 'ny', 'mi', 'nc'], 2),
                  'Rev' : [21000, 18200, 51200, 48732, 5676, 6798, 24012, 25005],
                  'Score' : np.random.normal(size = 8),
                  'Value' : np.random.randint(10, 50, size = 8)})
df

    date        State   Rev     Score       Value
0   2024-05-01  fl      21000   1.764052    34
1   2024-06-01  fl      18200   0.400157    22
2   2024-05-01  ny      51200   0.978738    11
3   2024-06-01  ny      48732   2.240893    48
4   2024-05-01  mi       5676   1.867558    49
5   2024-06-01  mi       6798   -0.977278   33
6   2024-05-01  nc      24012   0.950088    34
7   2024-06-01  nc      25005   -0.151357   27

预期输出应该是 dataframe Rev 排序,从最大到最小,并且在每个 State 中, date 列应该从in排序升序。

尝试了下面的代码:

(df.sort_values(by = ['Rev'], ascending = [False]).
     groupby('State', as_index = False).
     apply(lambda x : x.sort_values('date')).reset_index(drop = True))

但它没有给我所需的输出。

    date        State   Rev     Score               Value
0   2024-05-01  fl      21000   1.764052345967664   34
1   2024-06-01  fl      18200   0.4001572083672233  22
2   2024-05-01  mi       5676   1.8675579901499675  49
3   2024-06-01  mi       6798   -0.977277879876411  33
4   2024-05-01  nc      24012   0.9500884175255894  34
5   2024-06-01  nc      25005   -0.1513572082976979 27
6   2024-05-01  ny      51200   0.9787379841057392  11
7   2024-06-01  ny      48732   2.240893199201458   48

输出应该是 NY、NC、FL 和 MI,根据 Rev date 列按该顺序。 即对于 State 组, Rev 2024-05-01 值将决定哪个状态在最终输出顺序中优先。

有人可以帮助我编写代码吗?


可以通过使用 sort_values 对数据框进行两次排序来实现这一点,一次是对“Rev”进行降序排序,一次是对“date”进行升序排序:

df_sorted = df.sort_values(['Rev', 'date'], ascending=[False, True])

print(df_sorted)

这将产生以下输出:

         date State   Rev     Score  Value
2  2024-05-01   ny  51200  0.978738     11
3  2024-06-01   ny  48732  2.240893     48
6  2024-05-01   nc  24012  0.950088     34
7  2024-06-01   nc  25005 -0.151357     27
0  2024-05-01   fl  21000  1.764052     34
1  2024-06-01   fl  18200  0.400157     22
4  2024-05-01   mi   5676  1.867558     49
5  2024-06-01   mi   6798 -0.977278     33

在这个代码中:

  1. sort_values(['Rev', 'date'], ascending=[False, True]) 执行主要的排序操作。
    • ['Rev', 'date'] 指定用于排序的列。
    • ascending=[False, True] 定义排序顺序。 Rev 按降序排序( False ),而 date 在每个 Rev 组内按升序排序( True )。

此方法确保根据 Rev 对数据框进行排序,并且在每个 State 组中, date 按照时间顺序排列。

如果希望按照 Rev 2024-05-01 值对状态进行排序,则需要首先创建一个辅助列或系列,然后使用它来对数据框进行排序。以下是执行此操作的方法:

df['Rev_20240501'] = df.loc[df['date'] == '2024-05-01'].groupby('State')['Rev'].transform('first')
df_sorted = df.sort_values(['Rev_20240501', 'State', 'date'], ascending=[False, True, True]).drop('Rev_20240501', axis=1)
print(df_sorted)

这将提供所需的输出,其中各州按 Rev 2024-05-01 值排序,日期按每个州排序:

         date State   Rev     Score  Value
2  2024-05-01   ny  51200  0.978738     11
3  2024-06-01   ny  48732  2.240893     48
6  2024-05-01   nc  24012  0.950088     34
7  2024-06-01   nc  25005 -0.151357     27
0  2024-05-01   fl  21000  1.764052     34
1  2024-06-01   fl  18200  0.400157     22
4  2024-05-01   mi   5676  1.867558     49
5  2024-06-01   mi   6798 -0.977278     33

在本方法中:

  1. 我们使用 df.loc[df['date'] == '2024-05-01'] 创建了一个数据框子集,其中 date 为 '2024-05-01'`。

  2. 然后,我们使用 groupby('State') 对这个子集进行分组,并使用 transform('first') 为每个状态获取 Rev 的第一个(并且应该是唯一的,因为每个日期-状态组合只有一行)值。这将创建一个名为 Rev_20240501 的新列,其中包含每个状态的 2024-05-01 的相应 Rev 值。

  3. 最后,我们根据 Rev_20240501 State date 对数据框进行排序,并在排序后删除辅助列 Rev_20240501

标签:python,pandas
From: 78805430

相关文章

  • 保护从 py2exe python 生成的二进制文件
    我的项目需要将我的python文件转换为py2exe。公平地说,我的py2exe正在工作。假设我的二进制文件名为“test.exe”。我知道我的test.exe包含我的python文件的所有pyc文件。我想要做的是,保护我的text.exe,这样我的源代码就不会被看到,换句话说,我不希望它被反编译回来,我该怎......
  • python 将数字前面的字符替换为数字后面的新字符
    我有一些字符串看起来像:*.rem.1.gz和*.rem.2.gz我想将其替换为*.1.trim.gz和*.2.trim.gz1号文件和2号文件相互配对,我想创建一个单独的字符串来同时包含这两个文件。importosallfiles=os.listdirpair=[x.replace("rem.(\d+)","(\d+).trim")forxinall......
  • Pandas 将从 OECD 修订后的统计 API 中获取数据
    OECD更改了其统计API。在以前的版本中,此结构有效。oecd=pdmx.Request("OECD")data=oecd.data(resource_id="HH_DASH",key="AUS+DEU+ITA+JPN+KOR+GBR+USA+EU27_2020+EMU+G7M+OECD.RGDP_INDEX+RHHGDI_INDEX.Q/all?startTime=2007-Q1&endTime=202......
  • 使用python打开UNC文件
    如何使用python通过路径打开网络计算机上的文件?我当前正在使用os.startfile但随后出现错误winerror2:无法打开文件。文件路径是正确的,我可以通过win+R打开该文件。感谢您提供的任何帮助。importwin32wnetimportosdefopen_unc_path(unc_path,usern......
  • Python环境:深入理解与构建实践
    Python环境:深入理解与构建实践在当今的软件开发领域中,Python以其简洁的语法、丰富的库支持和广泛的应用场景,成为了众多开发者、数据科学家、机器学习工程师及自动化测试人员的首选语言。然而,要高效地使用Python进行项目开发,深入理解并合理构建Python环境是至关重要的。本文......
  • 界面自动化测试录制工具,让python selenium自动化测试脚本开发更加方便
    自动化测试中,QTP和seleniumIDE都支持浏览器录制与回放功能,简单的来说就像一个记录操作步骤的机器人,可以按照记录的步骤重新执行一遍,这就是脚本录制。个人觉得传统录制工具有些弊端,加上要定制支持我自己的自动化框架(python单机版自动化测试框架源代码),所以自己用javascript写了一个......
  • Python 面试常问问题及应用场景解析
    引言随着Python在数据科学、Web开发、自动化脚本、机器学习等领域中的广泛应用,越来越多的公司开始寻找具备Python技能的人才。因此,在Python面试中,面试官通常会通过一系列问题来评估应聘者的编程基础、问题解决能力和对Python特性的理解程度。本文将涵盖Python面试中最常见的......
  • python 虚拟环境
    python虚拟环境Python的venv模块允许你创建轻量级的“虚拟环境”,这些环境是独立的Python安装,用于项目的依赖隔离。每个虚拟环境都有自己的Python解释器、库和脚本,与系统中安装的Python相互隔离。这意呀着,你可以在一个项目中安装特定版本的库,而不会影响到系统上其他Pyt......
  • 使用 Azure Devops API (Python) 撰写 PR 评论
    在任何地方都找不到直接的方法。如何通过Python中的AzureDevopsAPI将注释添加到拉取请求?可以使用AzureDevOpsPythonAPI将注释添加到拉取请求。以下是执行此操作的方法:1.安装AzureDevOps库:pipinstallazure-devops2.导入必要的类并对的组......
  • Python\Python312\Lib\site-packages\torch\lib\fbgemm.dll
    在此处输入图像描述我正在尝试从HuggingFace导入GPT-2变压器模型,但当我尝试导入它时,遇到错误。即使当我尝试仅导入Torch时,我也会收到相同的错误。我已尝试重新安装Torch并完成了所有操作,包括更新VisualC++Redistributable软件包和更新我的驱动程序,但问题......