这是我的多索引数据框:
# Index Levels
outside = ['G1','G1','G1','G2','G2','G2']
inside = [1,2,3,1,2,3]
hier_index = list(zip(outside,inside))
hier_index = pd.MultiIndex.from_tuples(hier_index)
df = pd.DataFrame(np.random.randn(6,2),index=hier_index,columns=['A','B'])
df.index.names = ['Group','Num']
df
数据框如下所示:
A B
Group Num
G1 1 0.147027 -0.479448
2 0.558769 1.024810
3 -0.925874 1.862864
G2 1 -1.133817 0.610478
2 0.386030 2.084019
3 -0.376519 0.230336
我要实现的是返回Group
G1
和G2
,Num
1
和3
中的值像这样:
G1 1 0.147027 -0.479448
3 -0.925874 1.862864
G2 1 -1.133817 0.610478
3 -0.376519 0.230336
我尝试过
df.loc[['G1','G2']].loc[[1,3]]
但是什么也没显示。
然后我尝试了
df.xs([['G1','G2'],[1,3]])
但返回
TypeError:'([['G1','G2'],[1,3])'是无效的密钥。
有什么办法可以使它返回Group
G1
和G2
,Num
1
和3
中的值?
答案 0 :(得分:5)
作为.loc
的替代方法,您还可以像这样使用query
:
df.query('Group in ["G1", "G2"] and Num in [1, 3]')
它还会返回:
A B
Group Num
G1 1 -1.749477 -0.276759
3 0.888542 -0.656236
G2 1 0.757631 -1.091000
3 -1.203232 1.702107
如果您愿意,还可以在使用@
的查询中使用参数,如果您的列表很长,这可能会派上用场:
num_sel = [1, 3]
df.query('Group in ["G1", "G2"] and Num in @num_sel')
产生相同的输出。
然后,您还可以轻松地在列条目中添加其他约束,例如A
中的值必须大于0
:
df.query('Group in ["G1", "G2"] and Num in [1, 3] and A > 0')
返回
A B
Group Num
G1 3 0.888542 -0.656236
G2 1 0.757631 -1.091000
答案 1 :(得分:4)
将DataFrame.loc
用于列表:
df1 = df.loc[(['G1','G2'], [1,3]), :]
print (df1)
A B
Group Num
G1 1 2.165594 0.466762
3 0.451996 0.125071
G2 1 2.783947 0.176145
3 0.169508 0.071441
或使用slicers:
idx = pd.IndexSlice
df1 = df.loc[idx[['G1','G2'], [1,3]], :]
print (df1)
A B
Group Num
G1 1 0.617367 -1.010116
3 -0.990257 -1.262942
G2 1 1.336134 -0.198787
3 -0.310426 1.063520
答案 2 :(得分:1)
.loc
的{{1}}索引方法将每个索引的级别作为参数:
pandas
由于您的数据框具有2个索引和1个列级别,因此df.loc[['G1','G2'], [1,3],:]
方法将使用3个参数,每个索引级别一个,列一个。
您可以使用documentation阅读更多内容。