基于自定义排序的Python多索引头数据帧切片

2024-10-03 17:28:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我想弄清楚切片的方法。我有以下数据帧,df:

    Feeder # 1                               Feeder # 2
    TimeStamp   MW     Month   Day   Hour    TimeStamp      MW     Month     Day    Hour
0   2/3         1.2    1       30    22        2/3          2.4    1         30     22 
1   2/4         2.3    1       31    23        2/3          4.1    1         31     23
2   2/5         3.4    2       1     0         2/3          3.7    2         1      0

共有8条馈线。在

如果我想选择所有馈线中的所有MW列,我可以:

^{pr2}$

如果我想要2号到4号给料机,我可以:

df.loc[:,'Feeder #2':'Feeder #4']

但如果我想通过2兆瓦的馈电线通过2兆瓦的话:

df.loc[:,pd.IndexSlice['Feeder #2':'Feeder #4','MW':'Day']]

我得到以下错误。在

MultiIndex Slicing requires the index to be fully lexsorted tuple len (2), lexsort depth (1)

如果我可以对数据帧进行排序:

df.sortlevel(level=0,axis=1).loc[:,pd.IndexSlice['Feeder #2':'Feeder #4','Day':'MW']]

但是,对数据帧进行排序会破坏头中级别1的原始顺序——所有内容都按字母顺序排列(Python语言中的lexsorted?)。我想要的内容变得混乱:'Day':'MW'生成DayHour和{}列。但是我想要的是'MW':'Day',它将产生MWMonth和{}列。在

所以我的问题是:是否有可能对我的数据帧进行切片并保持列的顺序?或者,我是否可以对数据帧进行lexsort,执行所需的切片,然后将数据帧恢复到原来的顺序?在

提前谢谢。在


Tags: 数据df顺序切片loctimestampmwpd
1条回答
网友
1楼 · 发布于 2024-10-03 17:28:33

{cd1>你可以使用这个命令:

import pandas as pd
import numpy as np

level0 = "Feeder#1 Feeder#2 Feeder#3 Feeder#4".split()
level1 = "TimeStamp   MW     Month   Day   Hour".split()

idx0 = pd.CategoricalIndex(level0, level0, ordered=True)
idx1 = pd.CategoricalIndex(level1, level1, ordered=True)

columns = pd.MultiIndex.from_product([idx0, idx1])

df = pd.DataFrame(np.random.randint(0, 10, (10, 20)), columns=columns)

然后你可以这样做:

^{pr2}$

编辑

要将级别转换为CategoricalIndex,请执行以下操作:

columns = df.columns
for i in range(columns.nlevels):
    level = pd.unique(columns.get_level_values(i))
    cidx = pd.CategoricalIndex(level, level, sorted=True)
    print(cidx)

相关问题 更多 >