จะแปลงชุดข้อมูล Scikit-learn เป็นชุดข้อมูล Pandas ได้อย่างไร


117

ฉันจะแปลงข้อมูลจากวัตถุ Scikit-learn Bunch เป็น 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?

คำตอบ:


143

คุณสามารถใช้ตัวpd.DataFrameสร้างด้วยตนเองโดยให้อาร์เรย์ numpy ( data) และรายการชื่อของคอลัมน์ ( columns) หากต้องการมีทุกอย่างใน DataFrame เดียวคุณสามารถเชื่อมต่อคุณลักษณะและเป้าหมายลงในอาร์เรย์ตัวเลขเดียวโดยใช้np.c_[...](หมายเหตุ[]):

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
คุณสามารถเพิ่มข้อความเล็กน้อยเพื่ออธิบายรหัสนี้ได้หรือไม่? มาตรฐานของเราค่อนข้างสั้น
gung - คืนสถานะ Monica

1
บางกลุ่มมี feature_names เป็น ndarray ซึ่งจะทำลายพารามิเตอร์ของคอลัมน์

1
ไม่มีคีย์และค่า "Species" สำหรับ dataframe
mastash3ff

4
รหัสนี้ใช้ไม่ได้ตามที่เป็นอยู่สำหรับฉัน สำหรับพารามิเตอร์คอลัมน์ฉันต้องส่งในคอลัมน์ = np.append (iris ['feature_names'], 'target) ฉันทำอะไรผิดหรือเปล่าหรือคำตอบนี้ต้องการการแก้ไข
Josh Davis

2
สิ่งนี้ใช้ไม่ได้กับชุดข้อมูลทั้งหมดเช่นload_boston(). คำตอบนี้ใช้ได้ผลมากกว่า: stackoverflow.com/a/46379878/1840471
Max Ghenis

88
from sklearn.datasets import load_iris
import pandas as pd

data = load_iris()
df = pd.DataFrame(data.data, columns=data.feature_names)
df.head()

บทแนะนำนี้อาจเป็นที่สนใจ: http://www.neural.cz/dataset-exploration-boston-house-pricing.html


14
จำเป็นต้องเชื่อมต่อข้อมูลกับเป้าหมาย: df = pd.DataFrame (np.concatenate ((iris.data, np.array ([iris.target]). T), แกน = 1), คอลัมน์ = iris.feature_names + [' target '])
Tyler 傲来国主

62

โซลูชันของ TOMDLt ไม่ได้เป็นแบบทั่วไปเพียงพอสำหรับชุดข้อมูลทั้งหมดใน scikit-learn ตัวอย่างเช่นใช้ไม่ได้กับชุดข้อมูลที่อยู่อาศัยของบอสตัน ฉันเสนอวิธีแก้ปัญหาที่แตกต่างซึ่งเป็นสากลมากขึ้น ไม่ต้องใช้นูปปี้ด้วย

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

ตามหน้าที่ทั่วไป:

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

ฉันคิดว่าpd.Series(sklearn_dataset.target)สามารถแทนที่ด้วยsklearn_dataset.target? อย่างน้อยก็ใช้ได้กับฉันกับแพนด้า 1.1.3
3142 เมเปิ้ล

13

ฉันใช้เวลา 2 ชั่วโมงในการคิดออก

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)

คืนสายพันธุ์ให้แพนด้าของฉัน


11

เป็นอีกทางเลือกหนึ่งที่ฉันสามารถพันศีรษะได้ง่ายขึ้น:

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

โดยทั่วไปแทนที่จะเชื่อมต่อจาก get go เพียงแค่สร้าง data frame ที่มีเมทริกซ์ของคุณสมบัติจากนั้นเพิ่มคอลัมน์เป้าหมายด้วย data ['whatvername'] และคว้าค่าเป้าหมายจากชุดข้อมูล


8

มิฉะนั้นให้ใช้ชุดข้อมูลทะเลซึ่งเป็นเฟรมข้อมูลแพนด้าจริง:

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

เปรียบเทียบกับชุดข้อมูลการเรียนรู้ 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']


3

วิธีอื่นในการรวมคุณสมบัติและตัวแปรเป้าหมายสามารถใช้ได้np.column_stack( รายละเอียด )

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

ผลลัพธ์:

   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

หากคุณต้องการฉลากสตริงสำหรับtargetแล้วคุณสามารถใช้replaceโดยการแปลงtarget_namesไปdictionaryและเพิ่มคอลัมน์ใหม่:

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

ผลลัพธ์:

   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

โดยพื้นฐานแล้วสิ่งที่คุณต้องการคือ "ข้อมูล" และคุณมีอยู่ในกลุ่ม scikit ตอนนี้คุณต้องการเพียง "เป้าหมาย" (การคาดคะเน) ซึ่งอยู่ในกลุ่ม

ดังนั้นเพียงแค่ต้องเชื่อมสองสิ่งนี้เข้าด้วยกันเพื่อให้ข้อมูลสมบูรณ์

  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

ในเวอร์ชัน 0.23 คุณสามารถส่งคืน DataFrame ได้โดยตรงโดยใช้as_frameอาร์กิวเมนต์ ตัวอย่างเช่นการโหลดชุดข้อมูลม่านตา:

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

ตามความเข้าใจของฉันโดยใช้บันทึกประจำรุ่นซึ่งใช้งานได้กับชุดข้อมูลมะเร็งเต้านมเบาหวานตัวเลขม่านตาลินเนอร์ดไวน์และ california_houses


2

อัปเดต: 2020

คุณสามารถใช้พารามิเตอร์as_frame=Trueเพื่อรับดาต้าเฟรมของแพนด้า

หากมีพารามิเตอร์ as_frame (เช่น 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

หากไม่มีพารามิเตอร์ as_frame (เช่น 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)

2

นี่เป็นวิธีที่ง่ายสำหรับฉัน

boston = load_boston()
boston_frame = pd.DataFrame(data=boston.data, columns=boston.feature_names)
boston_frame["target"] = boston.target

แต่สามารถใช้กับ load_iris ได้เช่นกัน


1

การหาคำตอบที่ดีที่สุดและตอบความคิดเห็นของฉันนี่คือฟังก์ชั่นสำหรับการแปลง

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

สิ่งที่ TomDLT ตอบมันอาจไม่ได้ผลสำหรับคุณบางคนเพราะ

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

เนื่องจาก iris ['feature_names'] ส่งคืนอาร์เรย์จำนวนนับให้คุณ ในอาร์เรย์ numpy คุณไม่สามารถเพิ่มอาร์เรย์และรายการ ['target'] โดยใช้ตัวดำเนินการเพียง + ดังนั้นคุณต้องแปลงเป็นรายการก่อนแล้วจึงเพิ่ม

คุณทำได้

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

วิธีนี้จะได้ผลดี ..


0

อาจจะมีวิธีที่ดีกว่านี้ แต่นี่คือสิ่งที่ฉันเคยทำในอดีตและมันได้ผลดี:

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

ตอนนี้ mydata มีทุกสิ่งที่คุณต้องการไม่ว่าจะเป็นแอตทริบิวต์ตัวแปรเป้าหมายและชื่อคอลัมน์


1
การแก้ปัญหาโดย TomDLT นั้นเหนือกว่าที่ฉันแนะนำไว้ข้างต้นมาก มันทำสิ่งเดียวกัน แต่สวยงามมากและเข้าใจง่าย ใช้นั่นสิ!
HakunaMaData

mydata = pd.DataFrame(items[1][1])พ่นTypeError: 'dict_items' object does not support indexing
ตัวอย่าง SANBI

0

ตัวอย่างนี้เป็นเพียงน้ำตาลเชิงไวยากรณ์ที่สร้างขึ้นจากสิ่งที่TomDLT และ rolyatได้สนับสนุนและอธิบายไว้แล้ว ความแตกต่างเพียงอย่างเดียวคือload_irisจะส่งคืนทูเปิลแทนที่จะเป็นพจนานุกรมและมีการแจกแจงชื่อคอลัมน์

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

ขอบคุณสำหรับข้อมูลโค้ดนี้ซึ่งอาจให้ความช่วยเหลือเฉพาะบางอย่างได้ทันที คำอธิบายที่เหมาะสมมากจะเพิ่มมูลค่าในระยะยาวด้วยการแสดงเหตุผลนี้เป็นทางออกที่ดีในการแก้ไขปัญหาและจะทำให้มันมีประโยชน์มากขึ้นให้กับผู้อ่านในอนาคตกับอื่น ๆ คำถามที่คล้ายกัน โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายรวมถึงสมมติฐานที่คุณตั้งขึ้น
Goodbye StackExchange


0

วิธีที่ดีที่สุดวิธีหนึ่ง:

data = pd.DataFrame(digits.data)

Digits คือ dataframe แบบ sklearn และฉันแปลงเป็น DataFrame แพนด้า


0

ฉันได้แนวคิดสองสามข้อจากคำตอบของคุณและฉันไม่รู้ว่าจะทำให้สั้นลงได้อย่างไร :)

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

สิ่งนี้ทำให้ Pandas DataFrame พร้อมด้วย feature_names บวกเป้าหมายเป็นคอลัมน์และ RangeIndex (start = 0, stop = len (df), step = 1) ฉันต้องการรหัสที่สั้นกว่านี้ซึ่งฉันสามารถเพิ่ม 'เป้าหมาย' ได้โดยตรง


0

API นั้นสะอาดกว่าคำตอบที่แนะนำเล็กน้อย ที่นี่ใช้as_frameและต้องแน่ใจว่าได้รวมคอลัมน์การตอบกลับด้วย

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

นี่คือตัวอย่างวิธีการแบบบูรณาการอื่นที่อาจเป็นประโยชน์

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)

ข้อมูล iris_X ถูกอิมพอร์ตเป็น DataFrame แพนด้าและ iris_y เป้าหมายจะถูกอิมพอร์ตเป็นซีรีส์แพนด้า


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()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.