Pandas 按逻辑天对数据帧进行排序

Posted

技术标签:

【中文标题】Pandas 按逻辑天对数据帧进行排序【英文标题】:Pandas sort data frame by logical day 【发布时间】:2019-04-26 12:05:13 【问题描述】:

我有以下结果 pandas DateFrame: 我怎样才能让它正确排序?例如,将第 2 天排在第 1 天之后,而不是在第 11 天之后。如下面的第 2 组所示?

【问题讨论】:

【参考方案1】:

set_levels + sort_index

问题是您的字符串被排序为 字符串 而不是数字。首先将您的第一个索引级别转换为数字,然后按索引排序:

# split by whitespace, take last split, convert to integers
new_index_values = df.index.levels[1].str.split().str[-1].astype(int)

# set 'Day' level
df.index = df.index.set_levels(new_index_values, level='Day')

# sort by index
df = df.sort_index()

print(df)

           Value
Group Day       
A     0        1
      2        3
      11       2
B     5        5
      7        6
      10       4

设置

以上演示使用此示例设置:

df = pd.DataFrame('Group': ['A', 'A', 'A', 'B', 'B', 'B'],
                   'Day': ['Day 0', 'Day 11', 'Day 2', 'Day 10', 'Day 5', 'Day 7'],
                   'Value': [1, 2, 3, 4, 5, 6]).set_index(['Group', 'Day'])

print(df)

              Value
Group Day          
A     Day 0       1
      Day 11      2
      Day 2       3
B     Day 10      4
      Day 5       5
      Day 7       6

【讨论】:

感谢您的帮助,非常感谢! 是否有索引仍然返回为“第 0 天”、“第 1 天”等,而不仅仅是整数? @TheCuriouslyCodingFoxah,完成转换后,不会。当然,您可以根据需要从整数计算字符串索引。但很少需要。【参考方案2】:

您需要对整数而不是字符串进行排序:

import pandas as pd
x = pd.Series([1,2,3,4,6], index=[3,2,1,11,12])
x.sort_index()

1     3
2     2
3     1
11    4
12    6
dtype: int64

y = pd.Series([1,2,3,4,5], index=['3','2','1','11','12'])
y.sort_index()

1     3
11    4
12    5
2     2
3     1
dtype: int64

我建议在列中只包含数字而不是字符串 'Day..'。

【讨论】:

以上是关于Pandas 按逻辑天对数据帧进行排序的主要内容,如果未能解决你的问题,请参考以下文章

使用 pandas 在数据帧上执行 groupby,按计数排序并获取 python 中的前 2 个计数

如何通过析取语句(逻辑“或”)对 pandas DataFrame 进行切片? [复制]

Pandas:根据条件将值从一个数据帧合并到另一个数据帧

如何按列剩余的几个月和几天对列进行排序

SQL server中的物理排序和逻辑排序是怎么回事

使用可变列对Pandas数据帧进行排序