428 Stimmen

Erstellen eines Pandas DataFrames aus einem Numpy-Array: Wie kann ich die Indexspalte und Spaltenüberschriften festlegen?

Ich habe ein Numpy-Array, das aus einer Liste von Listen besteht und eine zweidimensionale Array mit Zeilenbeschriftungen und Spaltennamen wie unten gezeigt darstellt:

data = np.array([['','Col1','Col2'],['Row1',1,2],['Row2',3,4]])

Ich möchte, dass das resultierende DataFrame Row1 und Row2 als Indexwerte und Col1, Col2 als Spaltenwerte hat.

Ich kann den Index wie folgt festlegen:

df = pd.DataFrame(data, index=data[:,0])

Ich bin jedoch unsicher, wie ich am besten Spaltenüberschriften zuweisen kann.

11voto

Mehmet Kazanç Punkte 113

Hier ein einfaches Beispiel zur Erstellung eines Pandas-Datenrahmens unter Verwendung eines NumPy-Arrays.

import numpy as np
import pandas as pd

# ein Array erstellen
var1  = np.arange(start=1, stop=21, step=1).reshape(-1)
var2 = np.random.rand(20,1).reshape(-1)
print(var1.shape)
print(var2.shape)

dataset = pd.DataFrame()
dataset['col1'] = var1
dataset['col2'] = var2
dataset.head()

9voto

WestCoastProjects Punkte 52482

Zusätzlich zu der Antwort von @behzad.nouri - können wir eine Hilfsfunktion erstellen, um dieses häufige Szenario zu behandeln:

def csvDf(dat, **kwargs):
  from numpy import array
  data = array(dat)
  if data is None or len(data) == 0 or len(data[0]) == 0:
    return None
  else:
    return pd.DataFrame(data[1:, 1:], index=data[1:, 0], columns=data[0, 1:], **kwargs)

Lass es uns ausprobieren:

data = [['','a','b','c'],['row1','row1cola','row1colb','row1colc'],
     ['row2','row2cola','row2colb','row2colc'],['row3','row3cola','row3colb','row3colc']]
csvDf(data)

In [61]: csvDf(data)
Out[61]:
             a         b         c
row1  row1cola  row1colb  row1colc
row2  row2cola  row2colb  row2colc
row3  row3cola  row3colb  row3colc

8voto

blue-sky Punkte 48726

Ich denke, dies ist eine einfache und intuitive Methode:

data = np.array([[0, 0], [0, 1] , [1, 0] , [1, 1]])
reward = np.array([1,0,1,0])

dataset = pd.DataFrame()
dataset['StateAttributes'] = data.tolist()
dataset['reward'] = reward.tolist()

dataset

ergibt:

enter image description here

Aber es gibt Leistungsauswirkungen, die hier detailliert sind:

Wie setzt man den Wert einer Pandas-Spalte als Liste

1voto

Rafa Punkte 329

Es ist vielleicht nicht so kurz, aber es hilft vielleicht.

Array erstellen

import numpy as np
import pandas as pd

data = np.array([['col1', 'col2'], [4.8, 2.8], [7.0, 1.2]])

>>> data
array([['col1', 'col2'],
       ['4.8', '2.8'],
       ['7.0', '1.2']], dtype='

`Data Frame erstellen

df = pd.DataFrame(i for i in data).transpose()
df.drop(0, axis=1, inplace=True)
df.columns = data[0]
df

>>> df
  col1 col2
0  4.8  7.0
1  2.8  1.2`

1voto

not a robot Punkte 3525

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)

res

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)

res3

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

res2

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X