pandas 求助

343 天前
 ohayoo

我的 index 长这样:

MultiIndex([('2023-06-01 12:05:00', '1'), ('2023-06-01 12:05:00', '14'), ('2023-06-01 12:05:00', '2'), ('2023-06-01 12:05:00', '3'), ('2023-06-01 12:05:00', '4'), ('2023-06-01 12:05:00', '6'), ('2023-06-01 12:10:00', '1'), ('2023-06-01 12:10:00', '12'), ('2023-06-01 12:10:00', '14'), ('2023-06-01 12:10:00', '3'), ... ('2023-06-01 13:55:00', '1'), ('2023-06-01 13:55:00', '12'), ('2023-06-01 13:55:00', '13'), ('2023-06-01 13:55:00', '14'), ('2023-06-01 13:55:00', '15'), ('2023-06-01 13:55:00', '2'), ('2023-06-01 13:55:00', '3'), ('2023-06-01 13:55:00', '4'), ('2023-06-01 13:55:00', '6'), ('2023-06-01 13:55:00', '8')], names=['time', 'id'], length=207)

我想要每 5 分钟 按值的大小升序排序,也就是要变成这样:

MultiIndex([('2023-06-01 12:05:00', '1'), ('2023-06-01 12:05:00', '2'), ('2023-06-01 12:05:00', '3'), ('2023-06-01 12:05:00', '4'), ('2023-06-01 12:05:00', '6'), ('2023-06-01 12:05:00', '14'), ('2023-06-01 12:10:00', '1'), ('2023-06-01 12:10:00', '3'), ('2023-06-01 12:10:00', '12'), ('2023-06-01 12:10:00', '14'), ... ('2023-06-01 13:55:00', '1'), ('2023-06-01 13:55:00', '2'), ('2023-06-01 13:55:00', '3'), ('2023-06-01 13:55:00', '4'), ('2023-06-01 13:55:00', '6'), ('2023-06-01 13:55:00', '8') ('2023-06-01 13:55:00', '12'), ('2023-06-01 13:55:00', '13'), ('2023-06-01 13:55:00', '14'), ('2023-06-01 13:55:00', '15'),], names=['time', 'id'], length=207)

当然这个只是 index ,index 排序完之后 后面列的值要能跟着排序联动

不知道这样表达清楚了

893 次点击
所在节点    Python
4 条回复
ZedRover
343 天前
你可以使用 Pandas 的 sort_index 函数来实现这个目标,但是在此之前,你需要确保'id'列的数据类型是整数。如果不是,你可以使用 astype 函数将其转换为整数。以下是一个示例:


import pandas as pd

# 假设你的 DataFrame 是 df
# 首先,确保'id'列是整数类型
df.index = df.index.set_levels(df.index.levels[1].astype(int), level=1)

# 然后,对索引进行排序
df.sort_index(level=['time', 'id'], inplace=True)
这样,你的 DataFrame 将根据时间和 ID 进行排序,每 5 分钟内的 ID 将按升序排列。此操作还将影响 DataFrame 的行顺序,因此数据将与新的索引一起被重新排序。

需要注意的是,sort_index 函数的 level 参数允许你指定要排序的索引级别,你可以传入一个级别的列表来按照多个级别进行排序。在这个例子中,我首先按照'time'级别排序,然后按照'id'级别排序。inplace=True 意味着原地排序,也就是直接修改原始 DataFrame ,而不是创建一个新的 DataFrame 。

另外,使用 set_levels 函数可以修改 MultiIndex 的某一级别,这里我将'id'级别的值转换为整数类型。
Darcy90
343 天前
可以使用 sort_values 方法来排序,但是需要注意,MultiIndex 的排序方式和单层 index 是不一样的。

下面是一个示例代码:

import pandas as pd
import numpy as np

# 按时间升序排序,然后按值升序排序
df_sorted = df.sort_values(by=['time', 'a'], ascending=[True, True])

其中,by 参数指定了按哪些列排序,ascending 参数指定排序的方式,True 表示升序,False 表示降序。
另外,注意到一点,这个排序是按照时间升序排序的,而不是按照每 5 分钟排序的。如果你需要按照每 5 分钟排序,可以先将时间列转化为字符串,然后取出前缀表示每 5 分钟的时间段,再排序。
encro
343 天前
建议采用 chat gpt ,哈哈
ohayoo
343 天前
@ZedRover 大佬多谢多谢,牛的牛的,学的好扎实啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/948310

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX