Numpy dizisinden bir Pandas DataFrame oluşturma: Dizin sütununu ve sütun başlıklarını nasıl belirleyebilirim?


281

Aşağıda gösterildiği gibi satır etiketleri ve sütun adları ile iki boyutlu bir diziyi temsil eden listelerden oluşan bir Numpy dizisi var:

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

Elde edilen DataFrame satır değerleri ve satır2 dizin değerleri ve Col1, Col2 üstbilgi değerleri olması istiyorum

Dizini aşağıdaki gibi belirtebilirim:

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

ancak en iyi nasıl sütun başlıklarını atayacağından emin değilim.


3
@ behzad.nouri'nin cevabı doğrudur, ancak ilk verilere başka bir biçimde sahip olamayacağınızı düşünmelisiniz. Çünkü şimdi, değerleriniz dizeler olacak ve ints değil (numpy dizi karıştırma iç ve dizeleri nedeniyle, bu nedenle hepsi diziye dökülür, çünkü numpy dizilerinin homojen olması gerekir).
joris

Yanıtlar:


315

Belirtmek gerekir data, indexve columnshiç DataFrameolduğu gibi, yapıcı:

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

edit : @joris yorumunda olduğu gibi, np.int_(data[1:,1:])doğru veri türüne sahip olmak için yukarıdaki ayarları değiştirmeniz gerekebilir .


7
Bu işe yarar - ama giriş veri ve istenen uygulama böyle ortak bir yapı için DataFramebazı "kısayol" yok mu? Bu temelde csvs'nin yüklenme şeklidir ve birçok csv okuyucu için varsayılan işlem tarafından yönetilebilir . Df'ler için benzer bir yapı yararlı olacaktır.
javadba

Bunun için mini bir yardımcı / kolaylık yöntemi ek bir cevap olarak ekledim.
javadba

93

İşte anlaşılması kolay bir çözüm

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
Ama Seriesisimleri manuel olarak belirtmeniz gerekiyordu . Bu ölçeklenebilir değil.
javadba

24

Joris'e katılıyorum; Bu, farklı kayıt dizilerinde olduğu gibi bunu farklı yapmanız gerektiği anlaşılıyor . Bu harika yanıttan "seçenek 2" yi değiştirerek bunu şu şekilde yapabilirsiniz:

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

Bu sadece pandaların from_records DataFrame kullanılarak yapılabilir

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)

Bu cevap, soruda verilen örnek verilerle çalışmaz, yani data = array([['','Col1','Col2'],['Row1',1,2],['Row2',3,4]]).
jpp

Etiketleri belirtmediğimizde en basit genel çözüm.
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]

resim açıklamasını buraya girin


8

@ Behzad.nouri'nin cevabına ekleyerek - bu yaygın senaryoyu ele almak için bir yardımcı rutin oluşturabiliriz:

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)

Hadi deneyelim:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.