Membuat DataFrame Pandas dari array Numpy: Bagaimana cara menentukan kolom indeks dan header kolom?

281

Saya memiliki array Numpy yang terdiri dari daftar daftar, mewakili array dua dimensi dengan label baris dan nama kolom seperti yang ditunjukkan di bawah ini:

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

Saya ingin DataFrame yang dihasilkan memiliki Row1 dan Row2 sebagai nilai indeks, dan Col1, Col2 sebagai nilai header

Saya dapat menentukan indeks sebagai berikut:

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

namun saya tidak yakin bagaimana cara terbaik menetapkan tajuk kolom.

pengguna3132783
sumber
3
Jawaban @ behzad.nouri benar, tetapi saya pikir Anda harus mempertimbangkan jika Anda tidak dapat memiliki data awal dalam bentuk lain. Karena sekarang, nilai Anda akan berupa string dan bukan ints (karena array numpy mencampur int dan string, sehingga semua dicor ke string karena array numpy harus homogen).
joris

Jawaban:

315

Anda perlu menentukan data, indexdan columnsuntuk DataFramemembangun, seperti pada:

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

sunting : seperti dalam komentar @joris, Anda mungkin perlu mengubah di atas np.int_(data[1:,1:])untuk memiliki tipe data yang benar.

behzad.nouri
sumber
7
ini berfungsi - tetapi untuk struktur input data dan aplikasi yang diinginkan seperti DataFrameitu, apakah tidak ada "jalan pintas"? Ini pada dasarnya adalah cara yang csvdimuat - dan dapat dikelola dengan penanganan default untuk banyak pembaca csv. Struktur analog untuk df akan berguna.
javadba
Saya menambahkan metode pembantu mini / kenyamanan untuk ini sebagai jawaban tambahan.
javadba
93

Ini adalah solusi yang mudah dimengerti

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
sumber
20
Tapi Anda harus menentukan Seriesnama secara manual .. itu tidak dapat diskalakan.
javadba
24

Saya setuju dengan Joris; sepertinya Anda harus melakukan ini secara berbeda, seperti dengan array rekaman numpy . Mengubah "opsi 2" dari jawaban hebat ini , Anda bisa melakukannya seperti ini:

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
sumber
13

Ini dapat dilakukan hanya dengan menggunakan from_records panda DataFrame

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
sumber
Jawaban ini tidak berfungsi dengan contoh data yang diberikan dalam pertanyaan, yaitu data = array([['','Col1','Col2'],['Row1',1,2],['Row2',3,4]]).
jpp
Solusi umum paling sederhana ketika kita belum menentukan labelnya.
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]

masukkan deskripsi gambar di sini

Rahul Verma
sumber
8

Menambahkan ke jawaban @ behzad.nouri - kita dapat membuat rutinitas pembantu untuk menangani skenario umum ini:

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)

Mari kita coba:

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
sumber