Преобразовать строку с NaN в int в пандах

У меня есть фрейм данных pandas, все значения являются строками. Некоторые из них — «Нет», а остальные — целые числа, но в строковом формате, например «123456». Как я могу преобразовать все 'None' в np.nan, а другие - в целые числа, например, 123456.

df = {'col1': ['1', 'None'], 'col2': ['None', '123']}

Преобразовать дф в:

df = {'col1': [1, NaN], 'col2': [NaN, 123]}

Является ли df фреймом данных или словарем?

cs95 09.04.2019 04:48
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
6
1
6 060
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Используйте приведенный ниже код:

print(df.replace('None', np.nan).astype(float))

Выход:

   col1   col2
0   1.0    NaN
1   NaN  123.0

Вы должны использовать replace.

P.S. если df является словарем, сначала преобразуйте его:

df = pd.DataFrame(df)

Спасибо, а как насчет целочисленной строки? Будут ли они автоматически преобразованы в числа с плавающей запятой?

Ting Wang 09.04.2019 04:45

@TingWang Отредактировал мой, теперь они будут :-)

U12-Forward 09.04.2019 04:46

Просто небольшое замечание, поскольку теперь это принятый ответ: он преобразует числовые данные в числа с плавающей запятой, а не в целые числа (как требуется в ОП).

cs95 09.04.2019 05:02

Вы можете преобразовать свои столбцы в тип Целое число, допускающее значение NULL (новое в версии 0.24+):

d = {'col1': ['1', 'None'], 'col2': ['None', '123']}
res = pd.DataFrame({
    k: pd.to_numeric(v, errors='coerce') for k, v in d.items()}, dtype='Int32')
res

   col1  col2
0     1   NaN
1   NaN   123

С помощью этого решения числовые данные преобразуются в целые числа (но отсутствующие данные остаются как NaN):

res.to_dict()
# {'col1': [1, nan], 'col2': [nan, 123]}

В более старых версиях конвертируйте в object при инициализации DataFrame:

res = pd.DataFrame({
    k: pd.to_numeric(v, errors='coerce') for k, v in d.items()}, dtype=object)
res

  col1 col2
0    1  NaN
1  NaN  123

Оно отличается от решения для типов, допускающих значение NULL, выше — меняется только представление, а не фактические данные.

res.to_dict()
#  {'col1': [1.0, nan], 'col2': [nan, 123.0]}

Вы также можете использовать:

import pandas as pd
d = {'col1': ['1', 'None'], 'col2': ['None', '123']}
df = pd.DataFrame.from_dict(d).replace("None", value=pd.np.nan).astype(float)

   col1   col2
0   1.0    NaN
1   NaN  123.0

col1    1 non-null float64
col2    1 non-null float64
dtypes: float64(2)

Тип данных по-прежнему объектный, а числа — строки.

cs95 09.04.2019 04:54

Они все еще являются строками после вашего редактирования. Беги result.values.tolist() смотреть...

cs95 09.04.2019 05:00

Другие вопросы по теме