У меня есть фрейм данных pandas, все значения являются строками. Некоторые из них — «Нет», а остальные — целые числа, но в строковом формате, например «123456». Как я могу преобразовать все 'None' в np.nan, а другие - в целые числа, например, 123456.
df = {'col1': ['1', 'None'], 'col2': ['None', '123']}
Преобразовать дф в:
df = {'col1': [1, NaN], 'col2': [NaN, 123]}
Используйте приведенный ниже код:
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)
Спасибо, а как насчет целочисленной строки? Будут ли они автоматически преобразованы в числа с плавающей запятой?
@TingWang Отредактировал мой, теперь они будут :-)
Просто небольшое замечание, поскольку теперь это принятый ответ: он преобразует числовые данные в числа с плавающей запятой, а не в целые числа (как требуется в ОП).
Вы можете преобразовать свои столбцы в тип Целое число, допускающее значение 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)
Тип данных по-прежнему объектный, а числа — строки.
Они все еще являются строками после вашего редактирования. Беги result.values.tolist()
смотреть...
Является ли
df
фреймом данных или словарем?