1. Dtypes müssen neu zugewiesen werden
Das Problem mit dem ursprünglichen Array besteht darin, dass es Strings mit Zahlen mischt. Daher ist der Datentyp des Arrays entweder object
oder str
, was nicht optimal für das DataFrame ist. Dies kann behoben werden, indem am Ende des DataFrame-Aufbaus astype
aufgerufen wird.
df = pd.DataFrame(data[1:, 1:], index=data[1:, 0], columns=data[0, 1:]).astype(int)
2. Verwenden Sie read_csv
für Bequemlichkeit
Da data
im OP fast wie eine als numpy-Array eingelesene Textdatei ist, könnte man es in ein Datei-ähnliches Objekt umwandeln (unter Verwendung von StringIO
aus dem integrierten io
Modul) und stattdessen pd.read_csv
verwenden. Da read_csv
die erste Zeile als Spaltenbeschriftungen liest, muss nur angegeben werden, die erste Spalte als Index zu lesen. Außerdem schließt read_csv
die Datentypen, sodass keine Verwendung von astype()
usw. erforderlich ist.
from io import StringIO
df = pd.read_csv(StringIO('\n'.join([','.join(row) for row in data.tolist()])), index_col=[0])
Ein praktischer Wrapper-Funktion für den letzten Fall:
from io import StringIO
def read_array(data, index_col=[0], header=0):
sio = StringIO('\n'.join([','.join(row) for row in data.tolist()]))
return pd.read_csv(sio, index_col=index_col, header=header)
df = read_array(data)
Ein Vorteil dieser Methode ist, dass bei MultiIndex-Spalten oder -Indizes einige manuelle Arbeiten erforderlich sind, um das DataFrame korrekt mit pd.DataFrame
zu konstruieren. Mit read_array()
ist es sehr einfach (weil read_csv
dies intern behandelt, überlassen Sie diese Dinge einfach an pandas). Zum Beispiel für die folgenden Daten, geben Sie einfach an, welche Zeilen als Kopfzeilen gelesen werden sollen:
data = np.array([['', 'Col0', 'Col0'], ['', 'Col1', 'Col2'], ['Row1', 1, 2],['Row2', 3, 4]])
df = read_array(data, header=[0,1])
# Um das Äquivalent mit pd.DataFrame zu erstellen, muss ein pd.MultiIndex-Objekt konstruiert werden
df = pd.DataFrame(data[2:, 1:], index=data[2:, 0], columns=pd.MultiIndex.from_arrays(data[:2, 1:])).astype(int)
3. Numpy-Arrays in DataFrame umwandeln
Dies ist für andere Fälle als im OP angegeben, aber im Allgemeinen ist es möglich, ein Numpy-Array sofort in ein Pandas-DataFrame umzuwandeln. Wenn benutzerdefinierte stringifizierte Spaltenbeschriftungen benötigt werden, rufen Sie einfach add_prefix()
auf. Zum Beispiel,
arr = np.arange(9).reshape(-1,3)
df = pd.DataFrame(arr).add_prefix('Col')