在保持二级索引完整的同时对多索引数据框中的行进行排序

Posted

技术标签:

【中文标题】在保持二级索引完整的同时对多索引数据框中的行进行排序【英文标题】:Sorting rows in multi-index dataframe while keeping secondary index in tact 【发布时间】:2021-08-06 08:14:36 【问题描述】:

我设置了以下多索引数据框:

                              created_at  ... compound
conv_nr elem_nr                            ...         
0       0       2020-03-30 18:41:32+00:00  ...   0.7184
        1       2020-03-30 18:31:47+00:00  ...  -0.0003
1       0       2020-03-30 18:35:15+00:00  ...  -0.3612
        1       2020-03-30 18:34:00+00:00  ...   0.1877
        2       2020-03-30 18:29:36+00:00  ...  -0.1027
...                                   ...  ...      ...
29071   1       2019-05-22 12:58:12+00:00  ...   0.0000
29072   0       2019-05-22 13:20:31+00:00  ...  -0.6619
        1       2019-05-22 12:58:12+00:00  ...   0.0000
29073   0       2019-05-22 13:20:05+00:00  ...   0.7506
        1       2019-05-22 12:58:12+00:00  ...   0.0000

我正在努力订购,以便时间戳按升序排列,并且“elem_nr”也相应地重新索引(保持不变)。考虑什么时候 conv_nr = 0。结果应该是:

                               created_at  ... compound
conv_nr elem_nr                            ...         
0       0       2020-03-30 18:31:47+00:00  ...  -0.0003
        1       2020-03-30 18:41:32+00:00  ...   0.7184

所以基本上我需要获取递增时间戳,同时确保“elem_nr”不会被翻转/保持在原位。

【问题讨论】:

conv_nr 组升序排序? 【参考方案1】:

IIUC尝试使用.values或.to_numpy()来防止pandas影响索引:

import numpy as np
import pandas as pd

df = pd.DataFrame(
    'conv_nr': [0, 0, 1, 1, 1],
    'elem_nr': [0, 1, 0, 1, 2, ],
    'created_at': ['2020-03-30 18:41:32+00:00',
                   '2020-03-30 18:31:47+00:00',
                   '2020-03-30 18:35:15+00:00',
                   '2020-03-30 18:34:00+00:00',
                   '2020-03-30 18:29:36+00:00'],
    'compound': [0.7184, -0.0003, -0.3612, 0.1877, -0.1027]
)
df['created_at'] = pd.to_datetime(df['created_at'])
df = df.set_index(['conv_nr', 'elem_nr'])

# Use df.column accessor to select all columns
# Use .values to aligning by index
df[df.columns] = df.sort_values(
    ['conv_nr', 'created_at'], ascending=True
).values
print(df)

df:

                               created_at  compound
conv_nr elem_nr                                    
0       0       2020-03-30 18:31:47+00:00   -0.0003
        1       2020-03-30 18:41:32+00:00    0.7184
1       0       2020-03-30 18:29:36+00:00   -0.1027
        1       2020-03-30 18:34:00+00:00    0.1877
        2       2020-03-30 18:35:15+00:00   -0.3612

【讨论】:

以上是关于在保持二级索引完整的同时对多索引数据框中的行进行排序的主要内容,如果未能解决你的问题,请参考以下文章

在熊猫多索引数据框中返回满足逻辑索引条件的每个组的最后一行[重复]

使用索引值列表对 pandas 多索引数据框进行切片 [重复]

在遵循特定结构的同时按列对多索引进行排序

在尊重其索引结构的同时对多索引进行排序

如何更改多索引数据框中的索引

转换多索引数据框并按位置更改二级索引