提问人:AndysPythonStuff 提问时间:1/9/2023 更新时间:1/9/2023 访问量:50
如何使用多索引(列)数据帧对数据进行排序?
How do you sort data with multiindex (columns) dataframe?
问:
首先,请原谅我的词汇不好。我仍在为正确的术语而苦苦挣扎,并且刚刚发现我已经创建了一个多索引数据帧,我试图学习如何操作它。
多索引数据帧有 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) 公司代码。
我想学习如何执行以下操作:
如何提取“级别 0”列名称的列表。
如何提取“级别 1”列名称的列表。
对于 1 行(日期),提取所有“0 级”和一个“1 级”索引的数据。(例如,一家公司在一天内的所有财务数据)。
对于 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])]
给出无效的语法。谁能解释一下,或者向我指出一个有助于级别定义和圆括号/方括号和冒号的教程?
谢谢。
答:
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,工作得很好!
评论