2016-05-18 16 views
13

Jaki jest skuteczny sposób na uzyskanie przekątnej kwadratu DataFrame. Spodziewam się, że wynikiem będzie Series z MultiIndex z dwoma poziomami, z których pierwszym jest indeks drugiego rzędu kolumny DataFrame.panda DataFrame przekątna

Konfiguracja

import pandas as pd 
import numpy as np 

np.random.seed([3, 1415]) 
df = pd.DataFrame(np.random.rand(3, 3) * 5, 
        columns = list('abc'), 
        index = list('ABC'), 
        dtype=np.int64 
       ) 

Chcę zobaczyć:

print df.stack().loc[[('A', 'a'), ('B', 'b'), ('C', 'c')]] 

A a 2 
B b 2 
C c 3 

Odpowiedz

14

Jeśli nie przeszkadza numpy można użyć numpy.diag

pd.Series(np.diag(df), index=[df.index, df.columns]) 

A a 2 
B b 2 
C c 3 
dtype: int64 
6

Można zrobić coś takiego:

In [16]: 
midx = pd.MultiIndex.from_tuples(list(zip(df.index,df.columns))) 
pd.DataFrame(data=np.diag(df), index=midx) 

Out[16]: 
    0 
A a 2 
B b 2 
C c 3 

np.diag daje wartości przekątnych jako tablica NP , możesz następnie zbudować wieleindeks poprzez skompresowanie indeksu i kolumn i przekazanie go jako pożądanego indeksu w the DataFrame ctor.

Właściwie kompleks multiindex pokolenie nie musi być tak skomplikowane:

In [18]: 
pd.DataFrame(np.diag(df), index=[df.index, df.columns]) 

Out[18]: 
    0 
A a 2 
B b 2 
C c 3 

Ale johnchase's answer jest neater

+1

Pokonałeś mnie "numpy.diag" to dobre rozwiązanie. Czy konieczne jest jednak przekazanie mutliindeksu? czy to nie działa? 'pd.Series (np.diag (df), index = [df.index, df.columns])' – johnchase

+0

@johnchase faktycznie to lepsze rozwiązanie, po prostu zdecydowałem się dosłownie zrobić to, co OP poprosił o – EdChum

+0

@johnchase proszę przesłać odpowiedź z tym. po prostu uruchomiłem i pracowałem – piRSquared

3

Możesz również użyć iat w zrozumieniu listy, aby uzyskać przekątną.

>>> pd.Series([df.iat[n, n] for n in range(len(df))], index=[df.index, df.columns]) 
A a 2 
B b 2 
C c 3 
dtype: int64