Pandas Как заменить? с NaN - обработка нестандартных отсутствующих значений

Я новичок в pandas, я пытаюсь загрузить csv в Dataframe. У моих данных отсутствуют значения, представленные как?, и я пытаюсь заменить его стандартными пропущенными значениями - NaN

Пожалуйста, помогите мне с этим. Я пробовал читать через pandas docs, но я не могу следовать.

def readData(filename):
   DataLabels =["age", "workclass", "fnlwgt", "education", "education-num", "marital-status",
               "occupation", "relationship", "race", "sex", "capital-gain",
               "capital-loss", "hours-per-week", "native-country", "class"] 

   # ==== trying to replace ? with Nan using na_values
   rawfile = pd.read_csv(filename, header=None, names=DataLabels, na_values=["?"])
   age = rawfile["age"]
   print age
   print rawfile[25:40]

   #========trying to replace ?
   rawfile.replace("?", "NaN")
   print rawfile[25:40]

The Snap shot of the data

Ответ 1

Вы можете заменить это только для этого столбца, используя replace:

df['workclass'].replace('?', np.NaN)

или для всего df:

df.replace('?', np.NaN)

UPDATE

OK Я понял вашу проблему, по умолчанию, если вы не передаете разделительный символ, тогда read_csv будет использовать запятую ',' в качестве разделителя.

Ваши данные и, в частности, один пример, где у вас есть проблемная строка:

54, ?, 180211, Some-college, 10, Married-civ-spouse, ?, Husband, Asian-Pac-Islander, Male, 0, 0, 60, South, >50K

на самом деле является запятой и пространством в качестве разделителя, поэтому, когда вы проходили na_value=['?'], это не соответствовало, потому что все ваши значения имеют перед собой пробельный символ, который вы не можете наблюдать.

если вы измените свою строку следующим образом:

rawfile = pd.read_csv(filename, header=None, names=DataLabels, sep=',\s', na_values=["?"])

то вы должны обнаружить, что все это работает:

27      54               NaN  180211  Some-college             10 

Ответ 3

В порядке я получил его:

 #========trying to replace ?
    newraw= rawfile.replace('[?]', np.nan, regex=True)
    print newraw[25:40]

Ответ 4

несколько раз будут пробелы с? в файле, созданном такими системами, как Informatica или HANA

Сначала вам нужно убрать пробелы в DataFrame

temp_df_trimmed = temp_df.apply(lambda x: x.str.strip() if x.dtype == "object" else x)

А позже примените функцию для замены данных

temp_df_trimmed['RC'] = temp_df_trimmed['RC'].map(lambda x: np.nan if x=="?"  else x)