如何使用多索引(列)数据帧对数据进行排序?

How do you sort data with multiindex (columns) dataframe?

提问人:AndysPythonStuff 提问时间:1/9/2023 更新时间:1/9/2023 访问量:50

问:

首先,请原谅我的词汇不好。我仍在为正确的术语而苦苦挣扎,并且刚刚发现我已经创建了一个多索引数据帧,我试图学习如何操作它。

多索引数据帧有 30 行和 546 列,看起来像是这个的更大版本:

一个 B C D
机 管 局 BB型 抄送 机 管 局 BB型 抄送 机 管 局 BB型 抄送 机 管 局 BB型 抄送
日期
2023-01-02 1 24 6 3 2 7 3 10 12 5 9 21
2023-01-03 1 23 7 3 4 6 3 9 13 6 10 22
2023-01-04 2 22 8 4 6 7 3 9 12 8 14 24
2023-01-05 3 21 10 3 8 6 4 8 11 10 12 21

索引是时间戳日期,顶级(级别 0?) 列索引 A、B、C、D 等每个都具有相同的 91 秒级别(级别 1?)成员:aa、bb、cc 等

由于总共有 546 列和 91 个“1 级”列,因此必须有 6 个“0 级”列。我看不到它们,因为桌子太大了,只显示了第一个和最后一个。

实际上,它是从雅虎提取的股票数据表,其中 A、B、C 是 (6) 财务价值,如收盘价、成交量、高价等,aa、bb、cc 等是 (91) 公司代码。

我想学习如何执行以下操作:

  1. 如何提取“级别 0”列名称的列表。

  2. 如何提取“级别 1”列名称的列表。

  3. 对于 1 行(日期),提取所有“0 级”和一个“1 级”索引的数据。(例如,一家公司在一天内的所有财务数据)。

  4. 对于 1 行(日期),一个“级别 0”,其中包含所有“级别 0”数据。例如,所有公司一天的交易量数据。

我一直在尝试这样的事情:

df.loc[:,(['A','B'],['aa,'bb', 'cc'])]
df.loc['2023-01-02', :]

这有效,但我无法正确对括号和冒号进行排序以完成上述工作。

 df.loc[:,(['A','D'],['aa,'cc','ff'])]

df.loc['2023-01-05':,([A,C],[aa,dd])]

工作,但

df.loc['2023-01-05',([A:],[aa,dd])]

df.loc['2023-01-05',(A:,[aa,dd])]

给出无效的语法。谁能解释一下,或者向我指出一个有助于级别定义和圆括号/方括号和冒号的教程?

谢谢。

Python Pandas 排序 多索引

评论


答:

3赞 Psidom 1/9/2023 #1

若要拉取级别列名称列表,可以使用:get_level_values

df.columns.get_level_values(0)
#Index(['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D'], dtype='object')

df.columns.get_level_values(1)
#Index(['aa', 'bb', 'cc', 'aa', 'bb', 'cc', 'aa', 'bb', 'cc', 'aa', 'bb', 'cc'], dtype='object')

df.columns.get_level_values(0).unique()
#Index(['A', 'B', 'C', 'D'], dtype='object')

df.columns.get_level_values(1).unique()
#Index(['aa', 'bb', 'cc'], dtype='object')

对于 3 和 4,使用起来很方便:pd.IndexSlice

# all level zero data for a specific level one index
df.loc['2023-01-05', pd.IndexSlice[:, 'aa']]

#A  aa     3
#B  aa     3
#C  aa     4
#D  aa    10
#Name: 2023-01-05, dtype: int64

# all level one data for a specific level zero index

df.loc['2023-01-05', pd.IndexSlice['A', :]]
#A  aa     3
#   bb    21
#   cc    10
#Name: 2023-01-05, dtype: int64

评论

0赞 AndysPythonStuff 1/9/2023
当你知道怎么做时,就这么简单!谢谢,Psidom,工作得很好!