python - 在 Pandas 中排序两次

标签 python pandas sorting

我有一个包含三列的数据框 A:“id”、“value”和“date”。我正在按 id 进行 groupby,并注意到一些奇怪的事情:如果我对具有给定 id 的行进行两次连续排序,首先按值然后按日期,操作顺序会影响行的顺序。注意索引为 42915 和 42916 的行的顺序:

A.sort_values('value').sort_values('date')[A.sort_values('value').sort_values('date')['id'] == '0001249666']

id  value   date
42913   0001249666  113845.0    20130408
42914   0001249666  114597.0    20130430
42916   0001249666  125972.0    20140414
42915   0001249666  125971.0    20140414
42917   0001249666  136154.0    20150410
42918   0001249666  145551.0    20160407
42919   0001249666  152911.0    20170413

A[A['id'] == '0001249666'].sort_values('value').sort_values('date')

id  value   date
42913   0001249666  113845.0    20130408
42914   0001249666  114597.0    20130430
42915   0001249666  125971.0    20140414
42916   0001249666  125972.0    20140414
42917   0001249666  136154.0    20150410
42918   0001249666  145551.0    20160407
42919   0001249666  152911.0    20170413

但是,如果我使用带有两个参数的 .sort_values,顺序无关紧要。

A.sort_values(['date','value'])[A.sort_values(['date','value'])['id'] == '0001249666']

id  value   date
42913   0001249666  113845.0    20130408
42914   0001249666  114597.0    20130430
42915   0001249666  125971.0    20140414
42916   0001249666  125972.0    20140414
42917   0001249666  136154.0    20150410
42918   0001249666  145551.0    20160407
42919   0001249666  152911.0    20170413

a[a['id'] == '0001249666'].sort_values(['date','value'])

id  value   date
42913   0001249666  113845.0    20130408
42914   0001249666  114597.0    20130430
42915   0001249666  125971.0    20140414
42916   0001249666  125972.0    20140414
42917   0001249666  136154.0    20150410
42918   0001249666  145551.0    20160407
42919   0001249666  152911.0    20170413

现在我知道我正在做的并不是我想做的最聪明的方法,但我真的很想了解什么可以解释这种行为?当我不理解这种行为时,我隐含地假设了什么。

最佳答案

问题是排序算法不是stable ,因此具有相同排序值的行(当您有多个具有相同 date 的行时会发生这种情况)可能会相对于它们的原始相对顺序被打乱。这意味着,如果您对数据框调用排序两次,第一次排序将不会产生任何(可预测的)效果,因为第二次排序只会根据其自身的标准进行排序。 sort_values支持多种排序算法;如文档所述,默认为快速排序,但如果需要,您可以通过 kind='mergesort' 进行稳定排序。

显然,当您传递两列作为排序依据时,排序算法会同时考虑它们,因此排序会按预期进行。

关于python - 在 Pandas 中排序两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49110120/

相关文章:

python - 如何在 Python3 中实现 Javascript String.fromCharCode 以接受减号

python - 将当前数据帧值与 pandas 中先前时间步的聚合值进行比较

python - 将 pandas 组保存到单独的 CSV 文件

c++ - 用结构和数组切换结构?

Java 向下移动数组元素

python - 如何在 Windows 中使用 Python 删除只读属性目录?

python - 如何使用 setup.py 安装 wheel-style 包

python - Gio.MemoryInputStream 关​​闭时不释放内存

python - 使用 StyleFrame 从 Excel 读取

javascript - 排序后项目失去对齐