Pandas 按 MultiIndex 选择
Pandas selection by MultiIndex
关于通过 MultiIndex selecting 行的问题。
df:
colA ColB
A1 B1 1 ca1 cb1
2 ca2 cb2
B2 1 ca3 cb3
2 ca4 cb4
A2 B1 1 ca5 cb5
2 ca6 cb6
B2 1 ca7 cb7
2 ca8 cb8
我想 select 来自 A2/B1 的 colA,其中 MultiIndex levels(2) > 1。
我分多个步骤进行:
df1=df.loc[A2,[B7],:,]
出于某种原因,我必须在括号中显示级别 (1)
df1.index = x1.index.droplevel(0)
df1.index = x1.index.droplevel(0)
df1.loc[1:,'colA']
我知道这太多了,但我不知道如何更简单。我能想到的方法不想工作。
由于您使用的是未命名的索引列,因此一种方法是在 ilevel_*
-
上使用 query
df.query("ilevel_0 == 'A2' and ilevel_1 == 'B1' and ilevel_2 > 1")
colA ColB
A2 B1 2 ca6 cb6
另一种方法是使用 index.get_level_values
-
f = df.index.get_level_values
df.loc[(f(0) == 'A2') & (f(1) == 'B1') & (f(2) > 1)]
colA ColB
A2 B1 2 ca6 cb6
也可以分两次操作。先在A2
和B1
中使用loc
到select部分,然后在剩下的索引处再次查询,设置query('index > 1')
.
df = pd.DataFrame({'ColB': {('A1', 'B1', 1): 'cb1',
('A1', 'B1', 2): 'cb2',
('A1', 'B2', 1): 'cb3',
('A1', 'B2', 2): 'cb4',
('A2', 'B1', 1): 'cb5',
('A2', 'B1', 2): 'cb6',
('A2', 'B2', 1): 'cb7',
('A2', 'B2', 2): 'cb8'},
'colA': {('A1', 'B1', 1): 'ca1',
('A1', 'B1', 2): 'ca2',
('A1', 'B2', 1): 'ca3',
('A1', 'B2', 2): 'ca4',
('A2', 'B1', 1): 'ca5',
('A2', 'B1', 2): 'ca6',
('A2', 'B2', 1): 'ca7',
('A2', 'B2', 2): 'ca8'}})
# Answer here
df.loc["A2", "B1"].query("index > 1")
Output:
ColB colA
2 cb6 ca6
关于通过 MultiIndex selecting 行的问题。
df:
colA ColB
A1 B1 1 ca1 cb1
2 ca2 cb2
B2 1 ca3 cb3
2 ca4 cb4
A2 B1 1 ca5 cb5
2 ca6 cb6
B2 1 ca7 cb7
2 ca8 cb8
我想 select 来自 A2/B1 的 colA,其中 MultiIndex levels(2) > 1。 我分多个步骤进行:
df1=df.loc[A2,[B7],:,]
出于某种原因,我必须在括号中显示级别 (1)
df1.index = x1.index.droplevel(0)
df1.index = x1.index.droplevel(0)
df1.loc[1:,'colA']
我知道这太多了,但我不知道如何更简单。我能想到的方法不想工作。
由于您使用的是未命名的索引列,因此一种方法是在 ilevel_*
-
query
df.query("ilevel_0 == 'A2' and ilevel_1 == 'B1' and ilevel_2 > 1")
colA ColB
A2 B1 2 ca6 cb6
另一种方法是使用 index.get_level_values
-
f = df.index.get_level_values
df.loc[(f(0) == 'A2') & (f(1) == 'B1') & (f(2) > 1)]
colA ColB
A2 B1 2 ca6 cb6
也可以分两次操作。先在A2
和B1
中使用loc
到select部分,然后在剩下的索引处再次查询,设置query('index > 1')
.
df = pd.DataFrame({'ColB': {('A1', 'B1', 1): 'cb1',
('A1', 'B1', 2): 'cb2',
('A1', 'B2', 1): 'cb3',
('A1', 'B2', 2): 'cb4',
('A2', 'B1', 1): 'cb5',
('A2', 'B1', 2): 'cb6',
('A2', 'B2', 1): 'cb7',
('A2', 'B2', 2): 'cb8'},
'colA': {('A1', 'B1', 1): 'ca1',
('A1', 'B1', 2): 'ca2',
('A1', 'B2', 1): 'ca3',
('A1', 'B2', 2): 'ca4',
('A2', 'B1', 1): 'ca5',
('A2', 'B1', 2): 'ca6',
('A2', 'B2', 1): 'ca7',
('A2', 'B2', 2): 'ca8'}})
# Answer here
df.loc["A2", "B1"].query("index > 1")
Output:
ColB colA
2 cb6 ca6