Преобразуйте только строковое представление числа в число в Pandas - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть панда Dataframe, и я понимаю, что когда в моих столбцах Dataframe есть только строковое представление чисел, тогда произойдет преобразование, в противном случае это не так. Приведенный ниже код используется для преобразования всех чисел в строковой форме в числа.

import pandas as pd
from functools import partial

df = pd.DataFrame({0: ['3', 'r'], 1: ['1', 's']})
df = df.apply(partial(pd.to_numeric, errors='ignore'))

Код выше не будет работать, потому что 'r' и 's' в столбцах. Так что все останется в виде строк. Как я могу получить код для преобразования '3' и '1' в числа 3 и 1?

1 Ответ

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

Как утверждает @ MadPhysicist , у Pandas.Series есть один dtype. Однако, это dtype может быть object, что означает, что все идет. Вы потеряете МНОГО преимуществ от числового значения dtype, но это может быть тем, что вы хотите.

Принудительно вводить нечисловые значения в NaN

df.apply(pd.to_numeric, errors='coerce')

     0    1
0  3.0  1.0
1  NaN  NaN

Примечание:
apply перебирает каждый столбец и пропускает этот столбец через заданный callable. Это означает, что каждый столбец получил такую ​​обработку:

pd.to_numeric(one_of_the_columns, errors='coerce')

Использование errors='coerce' делает вещи такими, какие они могут, и np.nan в противном случае.


Используйте dtype объект и отбросьте эффективность для ... всего, что вы пытаетесь сделать

df = df.applymap(lambda x: pd.to_numeric(x, errors='ignore'))
df

   0  1
0  3  1
1  r  s

Чтобы проверить, что оно действительно изменилось 3 на число, попробуйте:

df.applymap(type)

                       0                      1
0  <class 'numpy.int64'>  <class 'numpy.int64'>
1          <class 'str'>          <class 'str'>

Примечание:
applymap перебирает каждую ячейку кадра данных и передает значение этой ячейки через переданный callable. В этом случае каждая ячейка была обработана как:

pd.to_numeric(one_particular_cell, errors='ignore')

И был превращен в число, если возможно, иначе оставлено в покое.

Это неэффективно, но делает то, что вы хотите. Когда Панды пытаются согласовать нанесенный вами урон, он понимает, что в некоторых столбцах есть смешанные типы, и меняет значение dtype на object для размещения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...