Làm thế nào để chuyển đổi tập dữ liệu Scikit-learning thành tập dữ liệu Pandas?


106

Làm cách nào để chuyển đổi dữ liệu từ đối tượng Scikit-learning Bunch thành Pandas DataFrame?

from sklearn.datasets import load_iris
import pandas as pd
data = load_iris()
print(type(data))
data1 = pd. # Is there a Pandas method to accomplish this?

Câu trả lời:


132

Theo cách thủ công, bạn có thể sử dụng hàm pd.DataFrametạo, đưa ra một mảng ( data) numpy và danh sách tên của các cột ( columns). Để có mọi thứ trong một DataFrame, bạn có thể ghép các tính năng và đích vào một mảng numpy với np.c_[...](lưu ý []):

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris

# save load_iris() sklearn dataset to iris
# if you'd like to check dataset type use: type(load_iris())
# if you'd like to view list of attributes use: dir(load_iris())
iris = load_iris()

# np.c_ is the numpy concatenate function
# which is used to concat iris['data'] and iris['target'] arrays 
# for pandas column argument: concat iris['feature_names'] list
# and string list (in this case one string); you can make this anything you'd like..  
# the original dataset would probably call this ['Species']
data1 = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
                     columns= iris['feature_names'] + ['target'])

3
Bạn có thể thêm một chút văn bản để giải thích mã này? Điều này hơi ngắn gọn theo tiêu chuẩn của chúng tôi.
gung - Khôi phục Monica

1
Một số nhóm có các feature_names như một ndarray sẽ phá vỡ tham số cột.

1
Thiếu khóa và giá trị "Loài" cho khung dữ liệu.
mastash3ff

4
Mã này không hoạt động đối với tôi. Đối với tham số cột, tôi cần chuyển vào cột = np.append (iris ['feature_names'], 'target). Tôi đã làm gì sai, hay câu trả lời này cần chỉnh sửa?
Josh Davis

2
Điều này không hoạt động cho tất cả các tập dữ liệu, chẳng hạn như load_boston(). Câu trả lời này hoạt động tổng quát hơn: stackoverflow.com/a/46379878/1840471
Max Ghenis


55

Giải pháp của TOMDLt không đủ chung cho tất cả các bộ dữ liệu trong scikit-learning. Ví dụ, nó không hoạt động đối với tập dữ liệu nhà ở của boston. Tôi đề xuất một giải pháp khác phổ biến hơn. Không cần sử dụng numpy là tốt.

from sklearn import datasets
import pandas as pd

boston_data = datasets.load_boston()
df_boston = pd.DataFrame(boston_data.data,columns=boston_data.feature_names)
df_boston['target'] = pd.Series(boston_data.target)
df_boston.head()

Như một chức năng chung:

def sklearn_to_df(sklearn_dataset):
    df = pd.DataFrame(sklearn_dataset.data, columns=sklearn_dataset.feature_names)
    df['target'] = pd.Series(sklearn_dataset.target)
    return df

df_boston = sklearn_to_df(datasets.load_boston())

10

Cũng giống như một giải pháp thay thế mà tôi có thể quấn quanh đầu dễ dàng hơn nhiều:

data = load_iris()
df = pd.DataFrame(data['data'], columns=data['feature_names'])
df['target'] = data['target']
df.head()

Về cơ bản, thay vì nối từ đầu, chỉ cần tạo một khung dữ liệu với ma trận các tính năng và sau đó chỉ cần thêm cột mục tiêu với dữ liệu ['whatvername'] và lấy các giá trị đích từ tập dữ liệu


9

Tôi đã mất 2 giờ để tìm ra điều này

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris

iris = load_iris()
##iris.keys()


df= pd.DataFrame(data= np.c_[iris['data'], iris['target']],
                 columns= iris['feature_names'] + ['target'])

df['species'] = pd.Categorical.from_codes(iris.target, iris.target_names)

Lấy lại loài cho gấu trúc của tôi


7

Nếu không, hãy sử dụng tập dữ liệu sơ sinh là khung dữ liệu gấu trúc thực tế:

import seaborn
iris = seaborn.load_dataset("iris")
type(iris)
# <class 'pandas.core.frame.DataFrame'>

So sánh với tập dữ liệu học scikit:

from sklearn import datasets
iris = datasets.load_iris()
type(iris)
# <class 'sklearn.utils.Bunch'>
dir(iris)
# ['DESCR', 'data', 'feature_names', 'filename', 'target', 'target_names']

4

Điều này làm việc cho tôi.

dataFrame = pd.dataFrame(data = np.c_[ [iris['data'],iris['target'] ],
columns=iris['feature_names'].tolist() + ['target'])

3

Có thể sử dụng cách khác để kết hợp các tính năng và biến mục tiêu np.column_stack( chi tiết )

import numpy as np
import pandas as pd
from sklearn.datasets import load_iris

data = load_iris()
df = pd.DataFrame(np.column_stack((data.data, data.target)), columns = data.feature_names+['target'])
print(df.head())

Kết quả:

   sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)     target
0                5.1               3.5                1.4               0.2     0.0
1                4.9               3.0                1.4               0.2     0.0 
2                4.7               3.2                1.3               0.2     0.0 
3                4.6               3.1                1.5               0.2     0.0
4                5.0               3.6                1.4               0.2     0.0

Nếu bạn cần nhãn chuỗi cho target, thì bạn có thể sử dụng replacebằng cách chuyển đổi target_namesthành dictionaryvà thêm cột mới:

df['label'] = df.target.replace(dict(enumerate(data.target_names)))
print(df.head())

Kết quả:

   sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)     target  label 
0                5.1               3.5                1.4               0.2     0.0     setosa
1                4.9               3.0                1.4               0.2     0.0     setosa
2                4.7               3.2                1.3               0.2     0.0     setosa
3                4.6               3.1                1.5               0.2     0.0     setosa
4                5.0               3.6                1.4               0.2     0.0     setosa

2

Về cơ bản những gì bạn cần là "dữ liệu", và bạn có nó trong nhóm scikit, bây giờ bạn chỉ cần "mục tiêu" (dự đoán) cũng nằm trong nhóm.

Vì vậy, chỉ cần ghép hai cái này lại để dữ liệu hoàn chỉnh

  data_df = pd.DataFrame(cancer.data,columns=cancer.feature_names)
  target_df = pd.DataFrame(cancer.target,columns=['target'])

  final_df = data_df.join(target_df)

2

Kể từ phiên bản 0.23, bạn có thể trả lại trực tiếp DataFrame bằng cách sử dụng as_frame đối số. Ví dụ: tải tập dữ liệu mống mắt:

from sklearn.datasets import load_iris
iris = load_iris(as_frame=True)
df = iris.data

Theo hiểu biết của tôi bằng cách sử dụng các ghi chú phát hành tạm thời , điều này phù hợp với bộ dữ liệu vú_cancer, bệnh tiểu đường, chữ số, mống mắt, linnerud, rượu vang và california_houses.


2

Cập nhật: 2020

Bạn có thể sử dụng tham số as_frame=True để lấy khung dữ liệu gấu trúc.

Nếu tham số as_frame có sẵn (ví dụ: load_iris)

from sklearn import datasets
X,y = datasets.load_iris(return_X_y=True) # numpy arrays

dic_data = datasets.load_iris(as_frame=True)
print(dic_data.keys())

df = dic_data['frame'] # pandas dataframe data + target
df_X = dic_data['data'] # pandas dataframe data only
ser_y = dic_data['target'] # pandas series target only
dic_data['target_names'] # numpy array

Nếu tham số as_frame KHÔNG khả dụng (ví dụ: load_boston)

from sklearn import datasets

fnames = [ i for i in dir(datasets) if 'load_' in i]
print(fnames)

fname = 'load_boston'
loader = getattr(datasets,fname)()
df = pd.DataFrame(loader['data'],columns= loader['feature_names'])
df['target'] = loader['target']
df.head(2)

1

Làm việc với câu trả lời tốt nhất và giải quyết nhận xét của tôi, đây là một chức năng để chuyển đổi

def bunch_to_dataframe(bunch):
  fnames = bunch.feature_names
  features = fnames.tolist() if isinstance(fnames, np.ndarray) else fnames
  features += ['target']
  return pd.DataFrame(data= np.c_[bunch['data'], bunch['target']],
                 columns=features)

1

Dù TomDLT trả lời nó có thể không hoạt động đối với một số bạn vì

data1 = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
                 columns= iris['feature_names'] + ['target'])

bởi vì iris ['feature_names'] trả về cho bạn một mảng không rõ ràng. Trong mảng numpy, bạn không thể thêm mảng và danh sách ['target'] chỉ bằng toán tử +. Do đó, bạn cần chuyển nó thành một danh sách trước rồi mới thêm vào.

Bạn có thể làm

data1 = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
                 columns= list(iris['feature_names']) + ['target'])

Điều này sẽ hoạt động tốt thôi ..


0

Có thể có một cách tốt hơn nhưng đây là những gì tôi đã làm trong quá khứ và nó hoạt động khá tốt:

items = data.items()                          #Gets all the data from this Bunch - a huge list
mydata = pd.DataFrame(items[1][1])            #Gets the Attributes
mydata[len(mydata.columns)] = items[2][1]     #Adds a column for the Target Variable
mydata.columns = items[-1][1] + [items[2][0]] #Gets the column names and updates the dataframe

Bây giờ mydata sẽ có mọi thứ bạn cần - thuộc tính, biến mục tiêu và tên cột


1
Giải pháp của TomDLT vượt trội hơn nhiều so với những gì tôi đang gợi ý ở trên. Nó làm điều tương tự nhưng rất thanh lịch và dễ hiểu. Sử dụng nó!
HakunaMaData

mydata = pd.DataFrame(items[1][1])némTypeError: 'dict_items' object does not support indexing
SANBI mẫu

0

Đoạn mã này chỉ là đường cú pháp được xây dựng dựa trên những gì TomDLT và rolyat đã đóng góp và giải thích. Sự khác biệt duy nhất load_irissẽ trả về một bộ giá trị thay vì một từ điển và tên các cột được liệt kê.

df = pd.DataFrame(np.c_[load_iris(return_X_y=True)])

Cảm ơn bạn về đoạn mã này, đoạn mã này có thể cung cấp một số trợ giúp hạn chế, tức thì. Một lời giải thích phù hợp sẽ cải thiện đáng kể giá trị lâu dài của nó bằng cách chỉ ra lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ làm cho nó hữu ích hơn cho những người đọc trong tương lai với những câu hỏi tương tự. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số giải thích, bao gồm cả những giả định bạn đã đưa ra.
Tạm biệt StackExchange vào

0
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
X = iris['data']
y = iris['target']
iris_df = pd.DataFrame(X, columns = iris['feature_names'])
iris_df.head()

0

Một trong những cách tốt nhất:

data = pd.DataFrame(digits.data)

Chữ số là khung dữ liệu sklearn và tôi đã chuyển đổi nó thành DataFrame gấu trúc


0

Tôi đã lấy một số ý tưởng từ câu trả lời của bạn và tôi không biết làm thế nào để làm cho nó ngắn hơn :)

import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris['feature_names'])
df['target'] = iris['target']

Điều này tạo ra một Pandas DataFrame với feature_names cộng với target là cột và RangeIndex (start = 0, stop = len (df), step = 1). Tôi muốn có một mã ngắn hơn mà tôi có thể thêm trực tiếp 'target' vào.


0

API gọn gàng hơn một chút so với các phản hồi được đề xuất. Tại đây, sử dụng as_framevà chắc chắn cũng bao gồm cột phản hồi.

import pandas as pd
from sklearn.datasets import load_wine

features, target = load_wine(as_frame=True).data, load_wine(as_frame=True).target
df = features
df['target'] = target

df.head(2)

0

Đây là một ví dụ phương pháp tích hợp khác có thể hữu ích.

from sklearn.datasets import load_iris
iris_X, iris_y = load_iris(return_X_y=True, as_frame=True)
type(iris_X), type(iris_y)

Dữ liệu iris_X được nhập dưới dạng DataFrame của gấu trúc và iris_y đích được nhập dưới dạng Chuỗi gấu trúc.


0
from sklearn.datasets import load_iris
import pandas as pd

iris_dataset = load_iris()

datasets = pd.DataFrame(iris_dataset['data'], columns = 
           iris_dataset['feature_names'])
target_val = pd.Series(iris_dataset['target'], name = 
            'target_values')

species = []
for val in target_val:
    if val == 0:
        species.append('iris-setosa')
    if val == 1:
        species.append('iris-versicolor')
    if val == 2:
        species.append('iris-virginica')
species = pd.Series(species)

datasets['target'] = target_val
datasets['target_name'] = species
datasets.head()
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.