2016-05-18 19 views
13

Was ist ein effizienter Weg, um die Diagonale eines Quadrats DataFrame zu erhalten. Ich würde erwarten, dass das Ergebnis ein Series mit einem MultiIndex mit zwei Ebenen ist, der erste ist der Index der DataFrame die zweite Ebene ist die Spalten der DataFrame.pandas DataFrame diagonal

Setup-

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 
       ) 

Ich möchte, dies sehen:

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

A a 2 
B b 2 
C c 3 

Antwort

14

Wenn Sie nicht mit numpy nichts dagegen könnten Sie numpy.diag verwenden

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

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

Sie so etwas tun könnte:

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 geben Ihnen die Diagonalwerte als np Array Sie können dann den Multiindex konstruieren, indem Sie den Index und die Spalten zippen und diesen als gewünschten Index übergeben die DataFrame ctor.

Tatsächlich ist die komplexe Multiindex Generation muss nicht so kompliziert sein:

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

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

Aber johnchase's answer ist ordentlicheres

+1

Sie schlagen mich zu ihr 'numpy.diag' ist eine gute Lösung. Ist es notwendig, einen Mutliindex zu übergeben? würde das nicht funktionieren? 'pd.Series (np.diag (df), index = [df.index, df.columns])' – johnchase

+0

@johnchase eigentlich, das ist eine bessere Lösung, habe ich gerade beschlossen, buchstäblich zu tun, was das OP gebeten – EdChum

+0

@johnchase bitte einreichen Eine Antwort damit. lief es einfach und funktioniert – piRSquared

3

Sie können auch iat in einem Listenverständnis verwenden, um die Diagonale zu erhalten.

>>> 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