Я хочу преобразовать таблицу, представленную в виде списка списков, в Pandas DataFrame
. В качестве чрезвычайно упрощенного примера:
a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a)
Каков наилучший способ преобразования столбцов в соответствующие типы, в данном случае столбцы 2 и 3 в числа с плавающей точкой? Есть ли способ указать типы при конвертации в DataFrame? Или лучше сначала создать DataFrame, а затем перебрать столбцы, чтобы изменить тип каждого столбца? В идеале я хотел бы сделать это динамически, потому что может быть сотни столбцов, и я не хочу точно указывать, какие столбцы какого типа. Все, что я могу гарантировать, это то, что каждый столбец содержит значения одного типа.
df.apply(pd.to_numeric, downcast="integer", errors="ignore")
уменьшения целочисленных столбцов до наименьшего (целочисленного) dtype, который будет содержать значения.Ответы:
У вас есть три основных варианта для преобразования типов в пандах:
to_numeric()
- обеспечивает функциональность для безопасного преобразования нечисловых типов (например, строк) в подходящий числовой тип. (См. Такжеto_datetime()
иto_timedelta()
.)astype()
- преобразовать (почти) любой тип в (почти) любой другой тип (даже если это не всегда целесообразно). Также позволяет конвертировать в категориальные типы (очень полезно).infer_objects()
- служебный метод для преобразования столбцов объектов, содержащих объекты Python, в тип панд, если это возможно.Продолжайте читать для более подробных объяснений и использования каждого из этих методов.
1.
to_numeric()
Лучший способ преобразовать один или несколько столбцов DataFrame в числовые значения - использовать
pandas.to_numeric()
.Эта функция попытается преобразовать нечисловые объекты (например, строки) в целые числа или числа с плавающей запятой, в зависимости от ситуации.
Основное использование
Вход
to_numeric()
является серия или один столбец DataFrame.Как видите, новая серия возвращается. Не забудьте назначить этот вывод переменной или столбцу, чтобы продолжить его использовать:
Вы также можете использовать его для преобразования нескольких столбцов DataFrame с помощью
apply()
метода:Пока ваши значения могут быть преобразованы, это, вероятно, все, что вам нужно.
Обработка ошибок
Но что, если некоторые значения не могут быть преобразованы в числовой тип?
to_numeric()
также принимаетerrors
аргумент ключевого слова, который позволяет принудительно указывать нечисловые значенияNaN
или просто игнорирует столбцы, содержащие эти значения.Вот пример использования серии строк,
s
имеющих объект dtype:Поведение по умолчанию - повышение, если оно не может преобразовать значение. В этом случае он не может справиться со строкой 'pandas':
Вместо того, чтобы потерпеть неудачу, мы могли бы хотеть, чтобы 'панды' считались отсутствующим / плохим числовым значением. Мы можем привести недопустимые значения к
NaN
следующему, используяerrors
ключевое слово аргумент:Третий вариант
errors
- просто игнорировать операцию, если встречается недопустимое значение:Этот последний вариант особенно полезен, когда вы хотите преобразовать весь свой DataFrame, но не знаете, какие из наших столбцов можно надежно преобразовать в числовой тип. В этом случае просто напишите:
Функция будет применяться к каждому столбцу DataFrame. Столбцы, которые можно преобразовать в числовой тип, будут преобразованы, тогда как столбцы, которые не могут (например, содержат нецифровые строки или даты), будут оставлены в покое.
понижающее приведение
По умолчанию преобразование с
to_numeric()
даст вам тип aint64
илиfloat64
dtype (или любую целую ширину, присущую вашей платформе).Обычно это то, что вы хотите, но что, если вы хотите сэкономить память и использовать более компактный dtype, например
float32
, илиint8
?to_numeric()
дает вам возможность понижать до «целое число», «подписано», «без знака», «с плавающей точкой». Вот пример для простой серииs
целочисленного типа:Понижение до «целого» использует наименьшее возможное целое число, которое может содержать значения:
Даункастинг до 'float' аналогично выбирает плавающий тип меньше обычного:
2.
astype()
Этот
astype()
метод позволяет вам четко указать тип d, который вы хотите иметь в своем DataFrame или Series. Он очень универсален в том, что вы можете попробовать перейти от одного типа к другому.Основное использование
Просто выберите тип: вы можете использовать dum типа NumPy (например
np.int16
), некоторые типы Python (например, bool) или типы, специфичные для панд (например, категориальный dtype).Вызовите метод для объекта, который вы хотите преобразовать, и
astype()
попытаетесь преобразовать его для вас:Заметьте, я сказал «попробуй» - если
astype()
не знает, как преобразовать значение в Series или DataFrame, это вызовет ошибку. Например, если у вас есть значениеNaN
или,inf
вы получите ошибку, пытаясь преобразовать его в целое число.Начиная с панд 0.20.0, эта ошибка может быть устранена путем передачи
errors='ignore'
. Ваш оригинальный объект будет возвращен нетронутым.Быть осторожен
astype()
мощный, но иногда он будет преобразовывать значения "неправильно". Например:Это маленькие целые числа, так как насчет преобразования в 8-битный тип без знака для экономии памяти?
Преобразование работало, но -7 был обернут, чтобы стать 249 (то есть 2 8 - 7)!
Попытка использовать downcast
pd.to_numeric(s, downcast='unsigned')
может помочь предотвратить эту ошибку.3.
infer_objects()
Версия 0.21.0 pandas представила метод
infer_objects()
для преобразования столбцов DataFrame, имеющих тип данных объекта, в более конкретный тип (мягкие преобразования).Например, вот DataFrame с двумя столбцами типа объекта. Один содержит действительные целые числа, а другой содержит строки, представляющие целые числа:
Используя
infer_objects()
, вы можете изменить тип столбца 'a' на int64:Столбец 'b' остался один, поскольку его значения были строками, а не целыми числами. Если вы хотите попытаться принудительно преобразовать оба столбца в целочисленный тип, вы можете использовать
df.astype(int)
вместо этого.источник
.convert_objects
считается испорченным0.17
- используйтеdf.to_numeric
вместо этогоpd.to_numeric
его методы-компаньоны будут работать только с одним столбцом за раз, в отличие от этогоconvert_objects
. Обсуждение функции замены в API, похоже, продолжается ; Я надеюсь, что метод, который работает во всем DataFrame, останется, потому что он очень полезен.int64
в данный моментint32
?astype
(как и в других ответов), то есть.astype(numpy.int32)
.Как насчет этого?
источник
pd.DataFrame
естьdtype
аргумент, который может позволить вам сделать, что вы ищете. df = pd.DataFrame (a, columns = ['one', 'two', 'three'], dtype = float) In [2]: df.dtypes Out [2]: один объект два float64 три float64 dtype: objectSettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_index,col_indexer] = value instead
. Возможно, это было введено в более новой версии панд, и я не вижу в этом ничего плохого, но мне просто интересно, что это за предупреждение. Есть идеи?ValueError: Cannot convert NA to integer
df = pd.DataFrame(a, columns=['one', 'two', 'three'], dtype={'one': str, 'two': int, 'three': float})
, Мне трудно найти спецификацию для принятых значений "dtype". Список был бы хорош (в настоящее время я делаюdict(enumerate(my_list))
).этот код ниже изменит тип данных столбца.
Вместо типа данных вы можете указать тип данных. Что вы хотите, например, str, float, int и т. д.
источник
bool
, все меняется наTrue
.Когда мне нужно было указать только определенные столбцы, и я хочу быть явным, я использовал (в соответствии с DOCS LOCATION ):
Итак, используя оригинальный вопрос, но предоставив ему имена столбцов ...
источник
Вот функция, которая принимает в качестве аргументов объект DataFrame и список столбцов и приводит все данные в столбцах к числам.
Итак, для вашего примера:
источник
Как насчет создания двух фреймов данных, каждый с разными типами данных для своих столбцов, а затем их объединения?
Результаты
После создания информационного кадра вы можете заполнить его переменными с плавающей запятой в 1-м столбце и строками (или любым другим типом данных) во 2-м столбце.
источник
панды> = 1,0
Вот диаграмма, которая суммирует некоторые из наиболее важных преобразований в пандах.
Преобразование в строку тривиально
.astype(str)
и не показано на рисунке."Жесткие" и "мягкие" преобразования
Обратите внимание, что «преобразования» в этом контексте могут относиться либо к преобразованию текстовых данных в их фактический тип данных (жесткое преобразование), либо к выводу более подходящих типов данных для данных в столбцах объекта (мягкое преобразование). Чтобы проиллюстрировать разницу, взгляните на
источник
Я думал, что у меня та же проблема, но на самом деле у меня есть небольшая разница, которая облегчает решение проблемы. Для других, смотрящих на этот вопрос, стоит проверить формат вашего списка ввода. В моем случае числа изначально плавающие, а не строки, как в вопросе:
но слишком долго обрабатывая список перед созданием информационного кадра, я теряю типы, и все становится строкой.
Создание фрейма данных через массив NumPy
дает тот же кадр данных, что и в вопросе, где записи в столбцах 1 и 2 рассматриваются как строки. Однако делать
на самом деле дает кадр данных со столбцами в правильном формате
источник
Стартовые панды 1.0.0 у нас есть
pandas.DataFrame.convert_dtypes
. Вы даже можете контролировать, какие типы конвертировать!источник