Scikit-learn 데이터 세트를 Pandas 데이터 세트로 변환하는 방법은 무엇입니까?


107

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?

답변:


134

수동으로 pd.DataFrame생성자 를 사용 하여 numpy 배열 ( data)과 열 이름 목록 ( )을 제공 할 수 있습니다 columns. 당신은 기능과 하나 개의 NumPy와 배열에 대상 연결할 수 있습니다, 하나 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
일부 묶음에는 column 매개 변수를 깨는 ndarray로 feature_names가 있습니다.

1
데이터 프레임에 대한 "Species"키 및 값이 없습니다.
mastash3ff

4
이 코드는 저에게있는 그대로 작동하지 않았습니다. columns 매개 변수의 경우 columns = np.append (iris [ 'feature_names'], 'target)을 전달해야했습니다. 내가 뭘 잘못 했나요? 아니면이 답변을 수정해야하나요?
Josh Davis

2
이는 load_boston(). 이 답변은 더 일반적으로 작동합니다. stackoverflow.com/a/46379878/1840471
Max Ghenis

78
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


11
데이터를 target과 연결해야합니다. df = pd.DataFrame (np.concatenate ((iris.data, np.array ([iris.target]). T), axis = 1), columns = iris.feature_names + [ ' target '])
Tyler 傲 来 国 主

56

TOMDLt의 솔루션은 scikit-learn의 모든 데이터 세트에 대해 충분히 일반적이지 않습니다. 예를 들어 보스턴 주택 데이터 세트에서는 작동하지 않습니다. 더 보편적 인 다른 솔루션을 제안합니다. numpy도 사용할 필요가 없습니다.

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

10

훨씬 더 쉽게 머리를 감쌀 수있는 대안으로서 :

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

기본적으로 처음부터 연결하는 대신 특성 행렬로 데이터 프레임을 만든 다음 데이터 [ 'whatvername']가있는 대상 열을 추가하고 데이터 집합에서 대상 값을 가져옵니다.


9

이것을 알아내는 데 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)

내 판다의 종을 되찾아


7

그렇지 않으면 실제 pandas 데이터 프레임 인 seaborn 데이터 세트 를 사용 하십시오 .

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

scikit learn 데이터 세트와 비교 :

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

이것은 나를 위해 작동합니다.

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

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_namesdictionary새로운 열을 추가 :

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 묶음에 포함되어 있습니다. 이제 묶음에있는 "target"(예측) 만 필요합니다.

따라서 데이터를 완성하려면이 두 가지를 연결하면됩니다.

  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인수를 사용하여 DataFrame을 직접 반환 할 수 있습니다 . 예를 들어 홍채 데이터 세트를로드합니다.

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

임시 릴리스 노트를 사용하여 이해 하면 breast_cancer, 당뇨병, 손가락, 홍채, linnerud, wine 및 california_houses 데이터 세트에 대해 작동합니다.


2

업데이트 : 2020

매개 변수 as_frame=True를 사용하여 pandas 데이터 프레임을 가져올 수 있습니다 .

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)

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 배열을 반환하기 때문입니다. 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 2016-06-29

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

가장 좋은 방법 중 하나 :

data = pd.DataFrame(digits.data)

Digits는 sklearn 데이터 프레임이며 팬더 데이터 프레임으로 변환했습니다.


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

이렇게하면 feature_names와 대상이 열 및 RangeIndex (start = 0, stop = len (df), step = 1) 인 Pandas DataFrame이 제공됩니다. 'target'을 직접 추가 할 수있는 더 짧은 코드를 갖고 싶습니다.


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는 pandas DataFrame으로 가져오고 대상 iris_y는 pandas 시리즈로 가져옵니다.


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

0

이것은 나를 위해 일한 쉬운 방법입니다.

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

그러나 이것은 load_iris에도 적용될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.