2017-12-06 2 views
2

Ich habe folgende Pandas (zum Beispiel im Zusammenhang hier:)Pandas Multi-Index Scheibe nur auf Sekundärindex

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 
) 

Ausgang würde

# 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 

sein, wenn ich hier sowohl auf Multiindex in Scheiben schneiden würde es so funktionieren:

# 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 

Aber wie kann ich nur auf sekundären Index "tim e "bei z.B. Zeit = 0 und jede Zeile mit dem ersten Index bekommen? Folgendes funktioniert nicht:

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

KeyError: 0 

Wie würde ich das hier tun?

Antwort

3

Verwenden xs mit der zweiten Ebene angeben oder loc mit : für ausgewählte alle Werte der ersten Ebene und 0 für ausgewählte Werte der zweiten Ebene:

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

Oder:

print (s.loc[:, 0]) 


a 0.376784 
b -0.643836 
c -0.440340 
dtype: float64 

Wenn mit Indizes arbeiten und Spalte (n) von DataFrame verwenden 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 
+0

Großen. ".xs" funktioniert jetzt, ich versuche gerade die Lösung mit meinem realen Datenrahmen, aber ich möchte alle Spalten anstelle von "a" auswählen/behalten. Wenn nur das Komma übrigbleibt, wird " UnsortedIndexError: 'MultiIndex Slicing benötigt den Index vollständig lexsortiert. Tuple len (2), lexsort depth (1)'" – Rockbar

+0

Ja, dann brauchen Sie 'df = df.sort_index()' zuerst. – jezrael

+0

In der Dokumentation ist es [hier] (http://pandas.pydata.org/pandas-docs/stable/advanced.html#sorting-a-multiindex) – jezrael

1

Die von jezrael vorgeschlagene Antwort ist ordentlich und funktioniert. Als alternativer Ansatz könnte man swaplevel() wie folgt verwenden:

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

variable 
a 1.534837 
b 1.311133 
c 0.215539 
dtype: float64 
Verwandte Themen