Python dtype ('O'). Тип данных объекта обработки. Преобразование в строку / целое число - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть стол из ImDB с актерами.

enter image description here

Из этой таблицы я хочу удалить все строки, в которых imdb_actors.birthYear отсутствует или меньше 1950, а также отбросить те, в которых imdb_actors.deathYear имеет какое-то значение.

Идея состоит в том, чтобы получить набор данных с актерами, которые живы и не вышли на пенсию.

imdb_actors.birthYear.dtype
Out:dtype('O')

И я не могу преобразовать в строку, это не поможет: imdb_actors['birthYear'] = imdb_actors['birthYear'].astype('|S'). Он просто разрушает все годы.

Вот почему я не могу выполнить: imdb_actors[imdb_actors.birthYear >= 1955] Когда я пытаюсь imdb_actors.birthYear.astype(str).astype(int), я получаю сообщение: ValueError: invalid literal for int() with base 10: '\\N'

Каким будет способ пропустить пропущенное и применить условие> = 1950?

Ответы [ 2 ]

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

Сначала преобразовать числовые данные в числовые серии:

num_cols = ['birthYear', 'deathYear']
df[num_cols] = df[num_cols].apply(pd.to_numeric, errors='coerce')

Указание errors='coerce' переводит неконвертируемые элементы в NaN.

Затем создайте маски для ваших 3 условий, объедините их с помощью векторизованного оператора | "или", отрицайте с помощью ~ и примените логическое индексирование к вашему фрейму данных:

m1 = df['birthYear'].isnull()
m2 = df['birthYear'] < 1950
m3 = df['deathYear'].notnull()

res = df[~(m1 | m2 | m3)]
0 голосов
/ 05 сентября 2018

Ваша проблема в том, что тип вашей серии YearYear - Object, который предназначен для строк или сочетания типов.

Сначала вы захотите очистить эту серию, применив такую ​​функцию:

imdb_actors.birthYear = imdb_actors.birthYear.map(lambda x: int(x) if str(x) != '\\N' else pd.np.nan)

тогда вы можете сделать фильтрацию:

imdb_actors[imdb_actors.birthYear >= 1955]
...