V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
ohayoo
V2EX  ›  Python

pandas 求助

  •  
  •   ohayoo · 2023-06-13 13:49:51 +08:00 · 1063 次点击
    这是一个创建于 559 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我的 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 排序完之后 后面列的值要能跟着排序联动

    不知道这样表达清楚了

    4 条回复    2023-06-13 15:09:38 +08:00
    ZedRover
        1
    ZedRover  
       2023-06-13 14:02:57 +08:00
    你可以使用 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
        2
    Darcy90  
       2023-06-13 14:09:45 +08:00
    可以使用 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
        3
    encro  
       2023-06-13 14:11:05 +08:00
    建议采用 chat gpt ,哈哈
    ohayoo
        4
    ohayoo  
    OP
       2023-06-13 15:09:38 +08:00
    @ZedRover 大佬多谢多谢,牛的牛的,学的好扎实啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1043 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 20:01 · PVG 04:01 · LAX 12:01 · JFK 15:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.