2017-06-28 5 views
0
import pandas as pd 
import numpy as np 
df = pd.read_csv('~/test.txt') 
list(df.columns.values) 

bekomme ich folgende Ausgabe:Erstellen numpy Array von Pandas Datenrahmen

['time', 'Res_fs1', 'angle1', 'Res_fs2', 'angle2', 'Res_ps1', 'Force1', 
'Res_ps2', 'Force2', 'object'] 

wenn ich versuche, eine numppy Array mit Res_fs1, Res_fs2, Res_ps1, Res_ps2

X=np.array(df['Res_fs1','Res_fs2','Res_ps1','Res_ps2']) 

ich zu erstellen diese Fehlermeldung sagt Schlüsselfehler, obwohl die Schlüssel vorhanden sind:

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "/usr/lib/python2.7/dist-packages/pandas/core/frame.py", line 1969, in 
__getitem__ 
return self._getitem_column(key) 
File "/usr/lib/python2.7/dist-packages/pandas/core/frame.py", line 1976, in 
_getitem_column 
return self._get_item_cache(key) 
File "/usr/lib/python2.7/dist-packages/pandas/core/generic.py", line 1091, 
in _get_item_cache 
values = self._data.get(item) 
File "/usr/lib/python2.7/dist-packages/pandas/core/internals.py", line 3211, 
in get 
loc = self.items.get_loc(item) 
File "/usr/lib/python2.7/dist-packages/pandas/core/index.py", line 1759, in 
get_loc 
return self._engine.get_loc(key) 
File "pandas/index.pyx", line 137, in pandas.index.IndexEngine.get_loc 
(pandas/index.c:3979) 
File "pandas/index.pyx", line 157, in pandas.index.IndexEngine.get_loc 
(pandas/index.c:3843) 
File "pandas/hashtable.pyx", line 668, in 
pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12265) 
File "pandas/hashtable.pyx", line 676, in 
pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12216) 
KeyError: ('Res_fs1', 'Res_fs2', 'Res_ps1', 'Res_ps2') 
+0

Mögliches Duplikat von https://stackoverflow.com/questions/13187778/convert-pandas-dataframe-to-numpy-array-preserving-index. Verwende 'as_matrix' oder' to_records'. – aleneum

Antwort

2

Sie können einfach tun:

X = df[['Res_fs1','Res_fs2','Res_ps1','Res_ps2']].values 

Wenn Sie Spalten Teilmenge, Sie doppelte eckige Klammern ‚[[‘ und ‚]]‘

+0

Genauer gesagt sind die äußeren Klammern syntaktischer Zucker für die getitem-Methode und es braucht ein einziges Argument. Ohne die inneren Klammern übergeben Sie dieser Methode viele Argumente. Mit den inneren Klammern übergeben Sie eine Liste, mit der sie umzugehen weiß. – piRSquared

+0

Die spezielle Methode '__getitem__' wird nicht viele Argumente übergeben, wenn keine Klammern vorhanden sind. Stattdessen wurde ein Tupel übergeben. Siehe den Schlüsselfehler –

1

Um wirklich verwenden müssen verstehen, was Sie Python müssen wissen, wie geschieht behandelt den Indexierungsoperator (die eckigen Klammern). Intern sind die eckigen Klammern eine spezielle Syntax zum Aufruf der speziellen Methode __getitem__ eines Objekts. Wenn das Objekt die spezielle Methode nicht implementiert, erhalten Sie einen Fehler, wie das Objekt die Indizierung nicht unterstützt.

Wenn Sie df['Res_fs1','Res_fs2','Res_ps1','Res_ps2'] aufrufen, interpretiert Python die durch Trennzeichen getrennten Spalten als Tupel. Es sendet das Tupel an die spezielle Methode des DataFrame __getitem__.

Intern wird dies aufgerufen.

Tupel sind unveränderliche Objekte und können gehashed werden und sind daher Kandidaten für Indexmitglieder. Pandas versucht, einen Spaltennamen zu finden, der genau das Tupel ('Res_fs1','Res_fs2','Res_ps1','Res_ps2') ist. Da Ihr Datenrahmen diese Spalte nicht enthält, wird KeyError ausgelöst. Wenn Sie df[['Res_fs1','Res_fs2','Res_ps1','Res_ps2']] anrufen, wird der __getitem__ spezielle Methode eine Liste übergeben. Listen können nicht gehashed und daher nicht Mitglied des Indexes sein. pandas nimmt daher einen völlig anderen Pfad und ruft alle Spaltennamen ab, die in der übergebenen Liste sind. Es wird einen KeyError auslösen, wenn einer der Einträge in der Liste kein Spaltenname ist.

1

pandas besitzt eine eingebaute Funktion für diesen Zweck: pandas.DataFrame.as_matrix

DataFrame.as_matrix (columns = None)

um den Rahmen zu seiner Darstellung Numpy-Array umwandeln.

Verwandte Themen