我有以下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
我怎么会这样做?
答案 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