কীভাবে একটি সাইকিট-লার্ন ডেটাসেটকে পান্ডাস ডেটাসেটে রূপান্তর করবেন?


117

আমি কীভাবে কোনও সাইকিট-লার্ন গুচ্ছ অবজেক্ট থেকে ডেটা রূপান্তর করব একটি পান্ডাস ডেটা ফ্রেমে?

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নির্মাতা ব্যবহার করতে পারেন , একটি নমপি অ্যারে ( data) এবং কলামগুলির নামের তালিকা ( columns) সরবরাহ করতে পারেন। একটি ডেটা ফ্রেমে সমস্ত কিছু রাখতে, আপনি বৈশিষ্ট্যগুলি এবং লক্ষ্যটিকে একটি নপি অ্যারেতে 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'])

4
আপনি এই কোডটি ব্যাখ্যা করার জন্য একটি সামান্য পাঠ্য যুক্ত করতে পারেন? এটি আমাদের মানদণ্ডের দ্বারা কিছুটা সংক্ষেপে is
গুং - মনিকা পুনরায়

4
কিছু কিছু গোছের বৈশিষ্ট্যর নামগুলি নাদার্রে হিসাবে রয়েছে যা কলামগুলির প্যারামিটারটি ভেঙে দেবে।

4
ডেটাফ্রেমের জন্য "প্রজাতি" কী এবং মানগুলি অনুপস্থিত।
mastash3ff

4
এই কোডটি আমার পক্ষে যেমনটি কাজ করে নি তেমন। কলামগুলির প্যারামিটারের জন্য, আমাকে কলামগুলিতে পাস করতে হবে = np.append (আইরিস ['বৈশিষ্ট্য_নাম'], 'লক্ষ্য)। আমি কি কিছু ভুল করেছি, নাকি এই উত্তরের কোনও সম্পাদনা দরকার?
জোশ ডেভিস 1

4
এটি সমস্ত ডেটাসেটের জন্য যেমন কাজ করে না load_boston()। এই উত্তর আরো সাধারণভাবে কাজ করে stackoverflow.com/a/46379878/1840471
ম্যাক্স 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
লক্ষ্য সহ ডেটা কনটেনেট করতে হবে: ডিএফ = পিডি.ডাটা ফ্রেম (এনপি.কম্যাটেনেট ((আইরিস.ডাটা, এনপি.আররে ([আইরিস.আরগেট])। টি), অক্ষ = 1), কলামগুলি = আইরিস। টার্গেট '])
টাইলার 主 来 国

62

টোমডিএলটি-র সমাধান সাইকিট-লার্নের সমস্ত ডেটাসেটের পক্ষে যথেষ্ট জেনেরিক নয়। উদাহরণস্বরূপ এটি বোস্টন হাউজিং ডেটাসেটের জন্য কাজ করে না। আমি একটি পৃথক সমাধান প্রস্তাব করি যা সর্বজনীন। পাশাপাশি নাম্পি ব্যবহার করার দরকার নেই।

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

মূলত গেটওয়ে থেকে কথা বলার পরিবর্তে বৈশিষ্ট্যগুলির ম্যাট্রিক্স দিয়ে একটি ডেটা ফ্রেম তৈরি করুন এবং তারপরে কেবলমাত্র ডেটা ['হোয়াটনেম'] সহ লক্ষ্য কলাম যুক্ত করুন এবং ডেটাসেট থেকে লক্ষ্য মানগুলি ধরুন


8

অন্যথায় সামুদ্রিক ডেটা সেটগুলি ব্যবহার করুন যা প্রকৃত পান্ডাস ডেটা ফ্রেম:

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

সাইকিট শিখুন ডেটা সেটগুলির সাথে তুলনা করুন:

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

মূলত আপনার যা দরকার তা হ'ল "ডেটা", এবং এটি সাইকিট গুচ্ছের মধ্যে রয়েছে, এখন আপনার কেবল "টার্গেট" (ভবিষ্যদ্বাণী) দরকার যা গুচ্ছের মধ্যেও রয়েছে।

সুতরাং ডেটা সম্পূর্ণরূপে তৈরি করার জন্য এই দু'জনকেই একত্রিত করা দরকার

  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 হিসাবে, আপনি as_frameযুক্তি ব্যবহার করে সরাসরি কোনও ডেটা ফ্রেম ফিরিয়ে দিতে পারেন । উদাহরণস্বরূপ, আইরিস ডেটা সেট লোড হচ্ছে:

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

অস্থায়ীভাবে প্রকাশিত নোটগুলি ব্যবহার করে আমার বোঝার ক্ষেত্রে , এটি স্তন_সংশ্লিষ্ট, ডায়াবেটিস, অঙ্কগুলি, আইরিস, ল্যাননারড, ওয়াইন এবং ক্যালিফোর্নিয়া_হাউসের ডেটা সেটগুলির জন্য কাজ করে।


2

আপডেট: 2020

as_frame=Trueপান্ডাস ডেটাফ্রেমগুলি পেতে আপনি প্যারামিটারটি ব্যবহার করতে পারেন ।

যদি as_frame পরামিতি উপলব্ধ (যেমন লোড_ইরিস)

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 প্যারামিটার না পাওয়া যায় (যেমন লোড_বস্টন)

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

তবে এটি লোড_ইরিসেও প্রয়োগ করতে পারে।


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

টমডিএলটি যা কিছু উত্তর দিয়েছে তা আপনার কারও জন্য কার্যকর নাও হতে পারে

data1 = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
                 columns= iris['feature_names'] + ['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

এখন মায়াডাটাতে আপনার প্রয়োজনীয় সমস্ত কিছু থাকবে - বৈশিষ্ট্য, টার্গেট ভেরিয়েবল এবং কলামের নাম


4
টমডিএলটি দ্বারা সমাধানটি আমি উপরে প্রস্তাব দিচ্ছি তার থেকে অনেক উচ্চতর। এটি একই জিনিসটি করে তবে এটি খুব মার্জিত এবং সহজে বোঝা যায়। যে ব্যবহার!
হাকুনামাতাটা

mydata = pd.DataFrame(items[1][1])নিক্ষেপTypeError: 'dict_items' object does not support indexing
সানবিআই নমুনাগুলি

0

এই স্নিপেটটি কেবল টমডিএলটি এবং রোলিয়েট যা ইতিমধ্যে অবদান এবং ব্যাখ্যা করেছে তার উপর নির্মিত সিনট্যাকটিক চিনি । পার্থক্যগুলি হ'ল কেবল অভিধানের পরিবর্তে একটি টুপল ফিরিয়ে দেবে এবং কলামগুলির নাম গণনা করা হবে।load_iris

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

এই কোড স্নিপেটের জন্য আপনাকে ধন্যবাদ, যা কিছু সীমিত, তাত্ক্ষণিক সহায়তা সরবরাহ করতে পারে। একটি সঠিক ব্যাখ্যা কেন এটি সমস্যার একটি ভাল সমাধান তা দেখিয়ে তার দীর্ঘমেয়াদী মানকে ব্যাপকভাবে উন্নত করবে এবং ভবিষ্যতে পাঠকদের আরও অন্যান্য অনুরূপ প্রশ্নের সাথে আরও দরকারী করে তুলবে। আপনার অনুমানগুলি সহ কিছু ব্যাখ্যা যুক্ত করতে দয়া করে আপনার উত্তরটি সম্পাদনা করুন।
বিদায় স্ট্যাক এক্সচেঞ্জ


0

অন্যতম সেরা উপায়:

data = pd.DataFrame(digits.data)

অঙ্কগুলি হ'ল স্ক্যালার ডেটাফ্রেম এবং আমি এটিকে একটি পান্ডাস ডেটা ফ্রেমে রূপান্তর করি


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

এটি কলাম এবং রেঞ্জইন্ডেক্স হিসাবে বৈশিষ্ট্য_নাম প্লাস লক্ষ্য সহ একটি পান্ডাস ডেটা ফ্রেম দেয় (শুরু = 0, স্টপ = লেন (ডিএফ), পদক্ষেপ = 1)। আমি একটি সংক্ষিপ্ত কোড রাখতে চাই যেখানে আমি সরাসরি 'লক্ষ্য' যুক্ত করতে পারি।


0

প্রস্তাবিত প্রতিক্রিয়াগুলির তুলনায় এপিআইটি কিছুটা পরিষ্কার। এখানে, ব্যবহার করে 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)

আইরিস_এক্স ডেটা পান্ডাস ডেটা ফ্রেম হিসাবে আমদানি করা হয় এবং লক্ষ্য আইরিস_ই প্যান্ডাস সিরিজ হিসাবে আমদানি করা হয়।


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.