Erstellen eines Pandas-Datenrahmens aus einem Numpy-Array: Wie gebe ich die Indexspalte und die Spaltenüberschriften an?

280

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

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

Ich möchte, dass der resultierende DataFrame Row1 und Row2 als Indexwerte und Col1, Col2 als Headerwerte enthält

Ich kann den Index wie folgt angeben:

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

Ich bin mir jedoch nicht sicher, wie ich Spaltenüberschriften am besten zuweisen soll.

user3132783
quelle
3
Die Antwort von @ behzad.nouri ist richtig, aber ich denke, Sie sollten überlegen, ob Sie die Anfangsdaten nicht in einer anderen Form haben können. Denn jetzt sind Ihre Werte Zeichenfolgen und keine Ints (aufgrund des Numpy-Arrays, das Ints und Strings mischt, werden alle in Zeichenfolgen umgewandelt, da Numpy-Arrays homogen sein müssen).
Joris

Antworten:

315

Sie müssen angeben data, indexund columnszum DataFrameKonstruktor, wie in:

>>> pd.DataFrame(data=data[1:,1:],    # values
...              index=data[1:,0],    # 1st column as index
...              columns=data[0,1:])  # 1st row as the column names

Bearbeiten : Wie im @ joris-Kommentar müssen Sie möglicherweise oben ändern np.int_(data[1:,1:]), um den richtigen Datentyp zu erhalten.

behzad.nouri
quelle
7
das funktioniert - aber gibt es für eine so gemeinsame Struktur von Eingabedaten und die gewünschte Anwendung auf a DataFramekeine "Verknüpfung"? Dies ist im Grunde die Art csvund Weise, wie s geladen werden - und kann von der Standardbehandlung für viele CSV-Reader verwaltet werden. Eine analoge Struktur für df's wäre nützlich.
Javadba
Als ergänzende Antwort habe ich eine Mini-Helfer- / Convenience-Methode hinzugefügt.
Javadba
93

Hier ist eine leicht verständliche Lösung

import numpy as np
import pandas as pd

# Creating a 2 dimensional numpy array
>>> data = np.array([[5.8, 2.8], [6.0, 2.2]])
>>> print(data)
>>> data
array([[5.8, 2.8],
       [6. , 2.2]])

# Creating pandas dataframe from numpy array
>>> dataset = pd.DataFrame({'Column1': data[:, 0], 'Column2': data[:, 1]})
>>> print(dataset)
   Column1  Column2
0      5.8      2.8
1      6.0      2.2
Jagannath Banerjee
quelle
20
Aber Sie mussten die SeriesNamen manuell angeben . Das ist nicht skalierbar.
Javadba
24

Ich stimme Joris zu. Es scheint, als ob Sie dies anders machen sollten, wie bei numpy record arrays . Wenn Sie "Option 2" aus dieser großartigen Antwort heraus ändern , können Sie dies folgendermaßen tun:

import pandas
import numpy

dtype = [('Col1','int32'), ('Col2','float32'), ('Col3','float32')]
values = numpy.zeros(20, dtype=dtype)
index = ['Row'+str(i) for i in range(1, len(values)+1)]

df = pandas.DataFrame(values, index=index)
Ryanjdillon
quelle
13

Dies kann einfach mithilfe von from_records von pandas DataFrame erfolgen

import numpy as np
import pandas as pd
# Creating a numpy array
x = np.arange(1,10,1).reshape(-1,1)
dataframe = pd.DataFrame.from_records(x)
Aadil Srivastava
quelle
Diese Antwort funktioniert nicht mit den in der Frage angegebenen Beispieldaten, d data = array([['','Col1','Col2'],['Row1',1,2],['Row2',3,4]]). H.
jpp
Die einfachste allgemeine Lösung, wenn wir die Beschriftungen nicht angegeben haben.
Cerebrou
12
    >>import pandas as pd
    >>import numpy as np
    >>data.shape
    (480,193)
    >>type(data)
    numpy.ndarray
    >>df=pd.DataFrame(data=data[0:,0:],
    ...        index=[i for i in range(data.shape[0])],
    ...        columns=['f'+str(i) for i in range(data.shape[1])])
    >>df.head()
    [![array to dataframe][1]][1]

Geben Sie hier die Bildbeschreibung ein

Rahul Verma
quelle
8

Hinzufügen zur Antwort von @ behzad.nouri - Wir können eine Hilfsroutine 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)

Probieren wir es aus:

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