Tạo một DataFrame Pandas từ một mảng Numpy: Làm cách nào để chỉ định các tiêu đề cột và cột chỉ mục?


280

Tôi có một mảng Numpy bao gồm một danh sách các danh sách, biểu thị một mảng hai chiều với các nhãn hàng và tên cột như dưới đây:

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

Tôi muốn DataFrame kết quả có Row1 và Row2 làm giá trị chỉ mục và Col1, Col2 làm giá trị tiêu đề

Tôi có thể chỉ định chỉ mục như sau:

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

tuy nhiên tôi không chắc chắn làm thế nào để gán tiêu đề cột tốt nhất.


3
Câu trả lời của @ Behzad.nouri là chính xác, nhưng tôi nghĩ bạn nên cân nhắc nếu bạn không thể có dữ liệu ban đầu ở dạng khác. Bởi vì bây giờ, các giá trị của bạn sẽ là chuỗi chứ không phải ints (do mảng numpy trộn ints và chuỗi, vì vậy tất cả được chuyển thành chuỗi vì mảng numpy phải đồng nhất).
joris

Câu trả lời:


315

Bạn cần phải xác định data, indexcolumnsđể DataFramexây dựng, như trong:

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

chỉnh sửa : như trong nhận xét @joris, bạn có thể cần thay đổi ở trên np.int_(data[1:,1:])để có kiểu dữ liệu chính xác.


7
điều này hoạt động - nhưng đối với một cấu trúc phổ biến của dữ liệu đầu vào và ứng dụng mong muốn cho một DataFramethì không có "phím tắt" nào? Về cơ bản, đây là cách mà csvs được tải - và có thể được quản lý bằng cách xử lý mặc định cho nhiều trình đọc csv. Một cấu trúc tương tự cho df's sẽ hữu ích.
javadba 17/11/18

Tôi đã thêm một phương pháp trợ giúp / tiện lợi nhỏ cho điều này như là một câu trả lời bổ sung.
javadba

93

Đây là một giải pháp dễ hiểu

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
Nhưng bạn phải tự xác định Seriestên .. không thể mở rộng.
javadba 17/11/18

24

Tôi đồng ý với Joris; có vẻ như bạn nên làm điều này một cách khác biệt, giống như với các mảng bản ghi numpy . Sửa đổi "tùy chọn 2" từ câu trả lời tuyệt vời này , bạn có thể làm như thế này:

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

Điều này có thể được thực hiện đơn giản bằng cách sử dụng from_records of pandas 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)

Câu trả lời này không hoạt động với dữ liệu mẫu được cung cấp trong câu hỏi, nghĩa là data = array([['','Col1','Col2'],['Row1',1,2],['Row2',3,4]]).
JPP

Giải pháp chung đơn giản nhất khi chúng tôi chưa chỉ định nhãn.
tiểu não

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]

nhập mô tả hình ảnh ở đây


8

Thêm vào câu trả lời của @ Behzad.nouri - chúng ta có thể tạo thói quen trợ giúp để xử lý tình huống phổ biến này:

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)

Hãy thử xem:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.