Как использовать логическое значение для переименования и замены значений в столбце? - PullRequest
2 голосов
/ 31 марта 2020

Я работаю с фреймом данных, и в нескольких столбцах данных отсутствуют категории, представленные '?' в столбце. Я пытаюсь использовать логическое значение для переименования и замены отсутствующих категорий, помеченных '?' на 'Private' в столбце labled workclass. Данные читаются как:

import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt
from pandas.plotting import scatter_matrix
from sklearn.preprocessing import *
url2="https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data" #Reading in Data from a freely and easily available source on the internet
Adult = pd.read_csv(url2, header=None)
##Assigning column names to the dataframe
Adult.columns = ["age","workclass","fnlwgt","education","educationnum","maritalstatus","occupation",  
                 "relationship","race","sex","capitalgain","capitalloss","hoursperweek","nativecountry",
                 "less50kmoreeq50kn"]

Я попытался запустить код:

MissingValue = Adult.loc[:, "workclass"] == "?"
Adult.loc[MissingValue, "workclass"] = "Private"

и

Adult.loc[ Adult.loc[:, "workclass"] == "?", "workclass"] = "Private"

Я не получаю никаких ошибок при запуске однако код при проверке значений столбца с помощью (Adult.loc[:,'workclass'].value_counts()) '?' все еще там. Код: Adult['workclass'] = Adult['workclass'].str.replace('?', 'Private') работает для того, что я хочу выполнить sh, однако я хотел бы иметь возможность сделать это с логическим значением. Любые предложения о том, почему это может происходить?

Ответы [ 2 ]

3 голосов
/ 31 марта 2020

Проблема в том, что ваше значение не соответствует точно '?', но, вероятно, что-то вроде '? '

Вы можете видеть это, потому что:

 Adult.loc[Adult['workclass']=='?',:]

возвращает пустой фрейм данных, тогда как

 Adult.loc[Adult['workclass'].str.strip()=='?',:]

возвращает 1836 строк

strip удаляет ведущие и конечные пробелы, чтобы вам не приходилось тестировать ' ?', '? ', ' ? ' et c

Поэтому, когда вы немного измените свой код, как это

MissingValue = Adult.loc[:, "workclass"].str.strip() == "?"
Adult.loc[MissingValue, "workclass"] = "Private"

Вы увидите, что '?' исчез из value_counts()

2 голосов
/ 31 марта 2020

После разделителя есть пробелы, поэтому добавьте параметр skipinitialspace:

Adult = pd.read_csv(url2, header=None, skipinitialspace=True)

, а затем корректно работайте с вашим кодом:

MissingValue = Adult["workclass"] == "?"
Adult.loc[MissingValue, "workclass"] = "Private"

print ((Adult['workclass'].value_counts().index.tolist()))
['Private', 'Self-emp-not-inc', 'Local-gov', 'State-gov', 
 'Self-emp-inc', 'Federal-gov', 'Without-pay', 'Never-worked']

print ((Adult['workclass'].value_counts()))
Private             24532
Self-emp-not-inc     2541
Local-gov            2093
State-gov            1298
Self-emp-inc         1116
Federal-gov           960
Without-pay            14
Never-worked            7
Name: workclass, dtype: int64

Проверьте пробел с помощью кода:

Adult = pd.read_csv(url2, header=None)

#Assigning column names to the dataframe
Adult.columns = ["age","workclass","fnlwgt","education","educationnum","maritalstatus","occupation",  
                 "relationship","race","sex","capitalgain","capitalloss","hoursperweek","nativecountry",
                 "less50kmoreeq50kn"]

print ((Adult['workclass'].value_counts().index.tolist()))
[' Private', ' Self-emp-not-inc', ' Local-gov', ' ?', ' State-gov',
 ' Self-emp-inc', ' Federal-gov', ' Without-pay', ' Never-worked']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...