Pandas не меняет категориальные данные [пол] на числовые значения [0/1] - PullRequest
1 голос
/ 12 мая 2019

Я пытаюсь проработать набор данных Титаник. Я хочу преобразовать столбец Sex в двоичные значения. Это моя попытка:

sex = train_dataset['Sex'].replace([0,1],['female','male'],inplace=True)

А когда я пытаюсь print(sex), консоль выводит None!

Я также пытался реализовать другие подходы к SO, но ни один из них, похоже, не работает. Ниже мой полный исходный код:

import pandas as pd
from numpy import corrcoef

train_dataset = pd.read_csv("https://raw.githubusercontent.com/oo92/Titanic-Kaggle/master/train.csv")
test_dataset = pd.read_csv("https://raw.githubusercontent.com/oo92/Titanic-Kaggle/master/test.csv")

survived = train_dataset['Survived']
pClass = train_dataset['Pclass']

#Doesn't work
sex = train_dataset['Sex'].replace([0,1],['female','male'],inplace=True)

age = train_dataset['Age']
fare = train_dataset['Fare']
parch = train_dataset['Parch']
sibSp = train_dataset['SibSp']

# print("Correlation between parent-children & survival is: " + str(corrcoef(survived, parch)))
# print("Correlation between age & survival is: " + str(corrcoef(survived, age)))
# print("Correlation between Siblings/Spouse & survival is: " + str(corrcoef(survived, sibSp)))

print(sex)

Ответы [ 4 ]

1 голос
/ 12 мая 2019

Официальная документация по параметрам:

inplace: bool, по умолчанию False, если True, на месте. Примечание: это будет изменить любые другие виды этого объекта (например, столбец из DataFrame). Возвращает вызывающую сторону, если это True.

Подводя итог, inplace=True возвращает None, а inplace=False возвращает копию объекта с выполненной операцией.

Итак, в вашем случае, если операция inplace=True, исходный объект серии train_dataset['Sex'] изменяется. Попробуйте напечатать train_dataset после операции, вы должны увидеть измененный фрейм данных.

См. Официальную документацию здесь

1 голос
/ 12 мая 2019

Попробуйте:

sex = train_dataset['Sex'].replace(['female','male'],[0,1])
print(sex)

Похоже, ваш синтаксис отключен.См. функция замены

Вывод: enter image description here

1 голос
/ 12 мая 2019

Вы можете использовать np.where

dataset['sex']=np.where(dataset['sex']=='female',0,1)
0 голосов
/ 12 мая 2019

Здесь есть две проблемы, во-первых, вы изменили аргументы в .replace(<replace_this>, <with_this>).Во-вторых, вы используете опцию inplace=True.Это изменяет экземпляр train_dataset вместо возврата значения.

Теперь, когда вы знаете, что при использовании inplace=True значение не возвращается, вы поймете, что sex должно быть равно None,потому что ничего не возвращается:

>>> import pandas as pd
>>> df = pd.DataFrame({'a': ['male', 'female', 'female', 'male']})
>>> df
        a
# 0    male
# 1  female
# 2  female
# 3    male

Без replace=True:

Теперь, когда мы заменим значения, мы получим

>>> df.replace(['female', 'male'], [0,1])
# a
# 0  1
# 1  0
# 2  0
# 3  1

Но df сам по себевыглядит все так же, как и раньше:

>>> df
        a
#  0    male
#  1  female
#  2  female
#  3    male

Таким образом, чтобы заменить значение в df, мы должны сделать:

>>> df['a'] = df['a'].replace(['male', 'female'], [0,1])
>>> df
#    a
# 0  0
# 1  1
# 2  1
# 3  0

На replace=True:

Когда вы запустите это вместо: df.replace(['female', 'male'], [0, 1], inplace=True)), вы сразу получите управляемую версию df:

>>> df.replace(['female', 'male'], [0, 1], inplace=True)
>>> df
#    a
# 0  0
# 1  1
# 2  1
# 3  0

Обратите внимание, что аргумент inplace=True означает, что значение не возвращается:

>>> test = df.replace(['female', 'male'], [0, 1], inplace=True)
>>> type(test)
# <class 'NoneType'>
...