Câu trả lời:
Theo cách thủ công, bạn có thể sử dụng hàm pd.DataFrame
tạ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'])
load_boston()
. Câu trả lời này hoạt động tổng quát hơn: stackoverflow.com/a/46379878/1840471
from sklearn.datasets import load_iris
import pandas as pd
data = load_iris()
df = pd.DataFrame(data.data, columns=data.feature_names)
df.head()
Hướng dẫn này có thể quan tâm: http://www.neural.cz/dataset-exploration-boston-house-pricing.html
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())
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
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
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']
Đ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'])
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 replace
bằng cách chuyển đổi target_names
thành dictionary
và 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
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)
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.
Bạn có thể sử dụng tham số as_frame=True
để lấy khung dữ liệu gấu trúc.
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
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)
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)
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 ..
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
mydata = pd.DataFrame(items[1][1])
némTypeError: 'dict_items' object does not support indexing
Đ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_iris
sẽ 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)])
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()
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
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.
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_frame
và 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)
Đâ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.
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()