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.


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.


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

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)

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)

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.