2017-05-30 1 views
2

Annahme eines Datenrahmens, df, mit Pandas in der Größe von n x m.Verwendung von Pandas Datenrahmen mit Scipy

Ich möchte Linearalgebra Operation auf df durchführen.

Bis jetzt konnte ich keine direkte lineare Algebra auf df finden. Was ich war in der Lage zu finden ist, wie df von Pandas Format Numpy konvertieren mit:

A = DataFrame.as_matrix 

dann kann ich simpy tun

linalg.inv(A) 

Gibt es einen direkten Weg linearen Betrieb der Durchführung in Scipy Pandas Datenrahmen verwenden? zum Beispiel:

linalg.inv(df) 

Der Grund, warum ich den linearen Algebra Betrieb von scipy statt Numpy nutzen möchte, basieren auf:

In jedem Fall SciPy mehr voll funktionsfähige Versionen der linearen enthalten Algebra-Module, sowie viele andere numerische Algorithmen. Wenn Sie mit Python wissenschaftlich arbeiten, sollten Sie wahrscheinlich NumPy und SciPy installieren. Die meisten neuen Funktionen gehören eher zu SciPy als zu NumPy.

von What-is-the-difference-between-NumPy-and-SciPy

+1

Sowohl 'pandas' und' scipy' auf 'numpy' gebaut. Die meisten "scipy" -Codes gehen davon aus, dass Eingaben Arrays sind oder in solche konvertiert werden können. 'scipy' 'inv' konvertiert die Eingabe in ein' numpy' Array (mit 'np.asarray'). Wenn ein Datenframe in einer scipy-Funktion arbeitet, liegt das daran, dass er in ein Array konvertiert werden kann. – hpaulj

Antwort

2

können Sie direkt auf den Datenrahmen verwenden.

Demo:

In [111]: from scipy.linalg import inv 

In [112]: df = pd.DataFrame(np.random.rand(5,5), columns=list('abcde')) 

In [113]: df 
Out[113]: 
      a   b   c   d   e 
0 0.619086 0.229390 0.361611 0.857177 0.274983 
1 0.389630 0.689562 0.687043 0.388781 0.781168 
2 0.702920 0.253870 0.881173 0.858378 0.363035 
3 0.007022 0.571111 0.408729 0.708862 0.042882 
4 0.876747 0.170775 0.499824 0.929295 0.762971 

In [114]: inv(df) 
Out[114]: 
array([[ 5.67652746, 1.54854922, -0.21927114, -3.04884324, -3.35567433], 
     [ 4.32996215, 1.99787442, -1.18579234, -0.9802008 , -2.98677673], 
     [-2.43833426, -0.29287732, 2.11691208, 0.34655505, 0.1519223 ], 
     [-1.92398165, -1.43903773, -0.22722582, 1.96404685, 2.16451337], 
     [-3.55144126, -0.28205091, -0.59264783, 1.10366465, 3.09938364]]) 

PS i Pandas 0.19.2 und SciPy 0.18.1 für diese Demo verwendet.

UPDATE:, wenn Sie einen Datenrahmen als Ergebnis zu erhalten:

In [4]: pd.DataFrame(inv(df), columns=df.columns, index=df.index) 
Out[4]: 
      a   b   c   d   e 
0 5.676507 1.548541 -0.219275 -3.048828 -3.355657 
1 4.329938 1.997865 -1.185791 -0.980187 -2.986760 
2 -2.438323 -0.292872 2.116913 0.346547 0.151914 
3 -1.923971 -1.439034 -0.227226 1.964040 2.164506 
4 -3.551428 -0.282045 -0.592647 1.103655 3.099373 
+0

Wenn ich in Ihrem Beispiel inv (df) mache, bekomme ich Numpy Array, richtig? – Eagle

+0

@Eagle, ich kann nicht sagen, ob es korrekt ist oder nicht ... Die Frage ist - was willst du erreichen? ;-) – MaxU