Преобразование разнородных панд. DataFrame в однородную - PullRequest
0 голосов
/ 08 сентября 2018

Я хочу проанализировать разнородные данные в виде наблюдений / переменных , содержащихся в pandas.DataFrame, например:

   Age   Name     Ok  Result
0   25    Bob   True     1.2
1   41   John  False     0.5
2   30  Alice   True     0.3

Для этого я обычно конвертирую его в Numpy представление, используя pandas.DataFrame.values, получая таким образом:

[[25 'Bob'   True  1.2]
 [41 'John'  False 0.5]
 [30 'Alice' True  0.3]]

, который включает только object тип, если я правильно понимаю документацию:

DataFrame со столбцами смешанного типа (например, str / object, int64, float32) приводит к ndarray самого широкого типа, который вмещает эти смешанные типы (например, object).

Вопрос : Как преобразовать pandas.DataFrame (или numpy.ndarray) гетерогенного типа в тип с однородным числовым типом, например:

[[25.0  1.0  1.0  1.2]
 [41.0  2.0  0.0  0.5]
 [30.0  3.0  1.0  0.3]]

, где есть соответствие между 'Bob' и 1.0, 'John' и 2.0 ... True и 1.0 ...

Я спрашиваю об этом, потому что хочу выполнить sklearn.decomposition.PCA для всех данных, что приводит к ошибке при работе со строковыми значениями.


Вот минимальный ( не ) рабочий пример:

import numpy as np
import pandas as pd
from sklearn.decomposition import PCA

d  = {'Name': ['Bob', 'John', 'Alice'], 'Age': [25, 41, 30], 'Result' : [1.2, 0.5, 0.3], 'Ok' : [True, False, True]}
df = pd.DataFrame(data=d)

df.info()
print(df)

data = df.values

print(data)

pca = PCA(n_components=all)
pca.fit(data)

1 Ответ

0 голосов
/ 08 сентября 2018

Прежде всего, если это образец исходных данных, то из концепции PCA нет способа получить хороший результат от PCA. Основным вариантом использования PCA являются многомерные данные с высокой размерностью. Поэтому, добавив значения Bob, Jhon, Alice как 1, 2, 3, вы получите хорошие результаты. Так как они уникальны, а не повторяют наблюдение из одного и того же класса. Но если это только для учебной цели, вы можете преобразовать данные следующим образом:

import pandas as pd

d  = {'Name': ['Bob', 'John', 'Alice'], 
      'Age': [25, 41, 30], 
      'Result' : [1.2, 0.5, 0.3], 
      'Ok' : [True, False, True]
      }

df = pd.DataFrame(data=d)

# change the true false to int
df['Ok'] = df.Ok.astype(int)

# put all unique name in the list
name_list = list(df.Name.unique())
# create a name map to replace the value
name_map = {name:id for  id, name in enumerate(name_list)}

# apply the map
df['Name'] = df['Name'].replace(name_map)

# put in to the array
data = df.values
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...