Pandas多索引切片仅在二级索引上

时间:2017-12-06 08:58:11

标签: python pandas multi-index

我有以下pandas(与此处的示例相关:pandas: slice a MultiIndex by range of secondary index

import numpy as np
import pandas as pd

variable = np.repeat(['a','b','c'], [5,5,5])
time = [0,1,5,10,20,0,1,5,10,20,0,1,5,10,20]

arra = [variable, time]

index=pd.MultiIndex.from_arrays(arra, names=("variable", "time"))

s = pd.Series(
    np.random.randn(len(sequence)), 
    index=index
)

输出

# In [1]: s
variable  time
a         0      -1.284692
          1      -0.313895
          5      -0.980222
          10     -1.452306
          20     -0.423921
b         0       0.248625
          1       0.183721
          5      -0.733377
          10      1.562653
          20     -1.092559
c         0       0.061172
          1       0.133960
          5       0.765271
          10     -0.648834
          20      0.147158
dtype: float64

如果我在这两个多索引上切片,它会像这样工作:

# In [2]: s.loc[("a",0),:]
variable  time
a         0       1.583589
          1      -1.081401
          5      -0.497904
          10      0.352880
          20     -0.179062
dtype: float64

但是我怎样才能在二级索引“时间”上切片,例如time = 0并获得第一个索引的每一行?以下内容不起作用:

# In [3]: s.loc[(0),:]

KeyError: 0

我怎么会这样做?

2 个答案:

答案 0 :(得分:3)

使用xs指定第二级或loc使用:选择所有第一级值,0选择第二级别值:

print (s.xs(0, level=1))

或者:

print (s.loc[:, 0])


a    0.376784
b   -0.643836
c   -0.440340
dtype: float64

如果使用DataFrame的索引和列,请使用slicers

idx = pd.IndexSlice
df = pd.concat([s,s * 10], axis=1, keys=['a','b'])
print (df)
                      a          b
variable time                     
a        0     1.054582  10.545820
         1    -1.716213 -17.162130
         5    -0.187765  -1.877645
         10   -0.419005  -4.190047
         20   -0.772808  -7.728078
b        0    -0.022520  -0.225202
         1    -0.638453  -6.384531
         5     0.410156   4.101559
         10    0.512189   5.121889
         20   -1.241232 -12.412322
c        0    -0.134815  -1.348148
         1    -1.007632 -10.076318
         5    -0.859790  -8.597898
         10   -0.623177  -6.231767
         20   -0.635504  -6.355036

print (df.loc[idx[:, 0], 'a'])
variable  time
a         0       1.054582
b         0      -0.022520
c         0      -0.134815
Name: a, dtype: float64

答案 1 :(得分:1)

jezrael建议的答案是整洁有效的。 作为替代方法,您可以使用swaplevel(),如下所示:

print(s.swaplevel().loc[0, :])

variable
a    1.534837
b    1.311133
c    0.215539
dtype: float64
相关问题