Как утверждает @ 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
для размещения.