Подтвердить что ты не робот

Python pandas: как указать типы данных при чтении файла Excel?

Я импортирую файл excel в фреймворк pandas с помощью функции pandas.read_excel().

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

Однако, когда я импортирую файл в фреймворк pandas, столбец импортируется как float. Это означает, что, например, '0614' становится 614.

Есть ли способ указать тип данных при импорте столбца? Я понимаю, что это возможно при импорте CSV файлов, но не может найти ничего в синтаксисе read_excel().

Единственное решение, о котором я могу думать, это добавить произвольную букву в начале текста (преобразование "0614" в "A0614" ) в Excel, чтобы убедиться, что столбец импортирован как текст, а затем отрубает "A" в python, поэтому я могу сопоставить его с другими таблицами, которые я импортирую из SQL.

4b9b3361

Ответ 1

Вы просто указываете преобразователи. Я создал таблицу Excel следующей структуры:

names   ages
bob     05
tom     4
suzy    3

Если столбец "age" форматируется как строки. Загрузить:

import pandas as pd

df = pd.read_excel('Book1.xlsx',sheetname='Sheet1',header=0,converters={'names':str,'ages':str})
>>> df
       names ages
   0   bob   05
   1   tom   4
   2   suzy  3

Ответ 2

Начиная с v0.20.0, аргумент ключевого слова dtype в read_excel() можно использовать для указания типов данных, которые необходимо применяется к столбцам, как это существует для read_csv() case.

Использование аргументов converters и dtype вместе при одном и том же имени столбца приведет к тому, что последний будет затенен, а прежний получит предпочтение.


1) Для того чтобы он не интерпретировал dtypes, а скорее передавал все содержимое столбцов, поскольку они были первоначально в файле раньше, мы могли бы установить этот аргумент str или object, чтобы мы не Не испортить наши данные. (одним из таких случаев были бы ведущие нули в числах, которые в противном случае терялись бы)

pd.read_excel('file_name.xlsx', dtype=str)            # (or) dtype=object

2) Он даже поддерживает отображение битов, в котором keys составляют имена столбцов и values соответствующий ему тип данных, особенно если вы хотите изменить dtype для подмножества всех столбцов.

# Assuming data types for `a` and `b` columns to be altered
pd.read_excel('file_name.xlsx', dtype={'a': np.float64, 'b': np.int32})

Ответ 3

Функция read_excel() имеет аргумент преобразователей, в котором вы можете применять функции для ввода в определенных столбцах. Вы можете использовать это, чтобы сохранить их как строки. Документация:

Dict функций для преобразования значений в определенные столбцы. Ключи могут быть целыми или столбцами, значения - это функции, которые принимают один входной аргумент, содержимое ячейки Excel и возвращают преобразованное содержимое.

Пример кода:

pandas.read_excel(my_file, converters = {my_str_column: str})

Ответ 4

Если вам неизвестно количество и имя столбцов в dataframe, то этот метод может быть полезен:

column_list = []
df_column = pd.read_excel(file_name, 'Sheet1').columns
for i in df_column:
    column_list.append(i)
converter = {col: str for col in column_list} 
df_actual = pd.read_excel(file_name, converters=converter)

где column_list - это список имен ваших столбцов.

Ответ 5

Если ваш ключ имеет фиксированное количество цифр, вы, вероятно, должны хранить как текст, а не как числовые данные. Для этого вы можете использовать аргумент converters или read_excel.

Или, если это не сработает, просто манипулируйте своими данными после его чтения в ваш фреймворк данных:

df['key_zfill'] = df['key'].astype(str).str.zfill(4)

  names   key key_zfill
0   abc     5      0005
1   def  4962      4962
2   ghi   300      0300
3   jkl    14      0014
4   mno    20      0020

Ответ 6

Если вы не знаете имен столбцов и хотите указать str тип данных для всех столбцов:

table = pd.read_excel("path_to_filename")
cols = table.columns
conv = dict(zip(cols ,[str] * len(cols)))
table = pd.read_excel("path_to_filename", converters=conv)