Python объединяет несколько таблиц Excel в dataframe

1

У меня есть файл excel с 10 рабочими листами. На некоторых листах есть данные, а некоторые - пустые, но это изменяется регулярно, включая первые и/или последние рабочие листы.

Используя Python 2.7, то, что я делаю, загружает все рабочие листы в pandas df для обработки другой функции. Я также добавляю столбец с именем рабочего листа. загрузка рабочих листов, кажется, работает нормально, но один из моих столбцов имеет значения 14-20 символов, заканчивающиеся на 0. поэтому, когда я распечатываю dict, они выглядят правильно, но pandas преобразуется в sci-нотацию, и я не могу понять, как сохранить эти значения.

вот некоторые данные диктата:

           API_NUM        NAME         DATE_START DATE_FINISH  SH_NAME
0   12345678910000   RAYES A - 1       2018-07-28  2018-08-25   Andy
1   12345678900000   RAYES A - 2       2018-07-28  2018-08-25   Mine
2   23456789090000   RAYES A - 3       2018-07-28  2018-08-25   Shef
3   34567890600000   RAYES A - 4       2018-07-28  2018-08-25   Mary
4   45678901220000   RAYES A - 5       2018-07-28  2018-08-25   Tom 

поэтому, когда я читаю данные, как показано ниже, он загружает штраф

excel_file ='my path to a xlsx'
sheets_dict = pd.read_excel(excel_file, sheet_name=None)
full_table = pd.DataFrame()
for name, sheet in sheets_dict.items():
    sheet['SH_NAME'] = name
    sheet = sheet.rename(columns=lambda x: x.split('\n')[-1])
    full_table = full_table.append(sheet)
full_table.reset_index(inplace=True, drop=True)

печать

sheets_dict 

API_NUM выглядит так, как должно, но full_table научный обозначает число.

Но -this закончил работу после all-

full_table['API_NUM'] = full_table['API_NUM'].map(lambda x: '{:.0f}'.format(x))


           API_NUM        NAME         DATE_START DATE_FINISH  SH_NAME
0        1234567891    RAYES A - 1       2018-07-28  2018-08-25   Andy
1        123456789     RAYES A - 2       2018-07-28  2018-08-25   Mine
2        2345678909    RAYES A - 3       2018-07-28  2018-08-25   Shef
3        3456789060    RAYES A - 4       2018-07-28  2018-08-25   Mary
4        4567890122    RAYES A - 5       2018-07-28  2018-08-25   Tom 



когда я преобразовываю значения в строки, они становятся чем-то вроде -2147483648

записывая df out в csv, столбец имеет завершающий вывод 0.

Проблема в том, что позже в другой функции я создаю строковый список этих значений для выполнения SQL-запроса. поэтому позже это выглядело бы так:

myTableValue IN ('12345678910000', '12345678900000', '23456789090000', '34567890600000', '45678901220000') 

и поле, в котором я запускаю запрос, является строковым полем.




Отредактировано: Я считаю, что функция лямбда в конечном итоге работала, это был случай с плохими данными и мной, что давало мне проблемы. Таким образом, этот метод или один ниже будут работать. Это может быть полезно для тех, кто хочет объединить рабочие листы в df с помощью Python

  • 0
    Является ли научное обозначение, представляющее другую ценность? Например, 100000000, выраженное как 1e8, является тем же значением. В противном случае рассмотрите возможность хранения API Num в виде целого числа, а не числа с плавающей запятой.
  • 0
    Я просто пытаюсь получить фактические значения, а не научную нотацию, которую я получаю как целое число
Теги:
pandas

1 ответ

0

Ну, чтобы решить мой собственный пост. То, что, похоже, сработало, - это другой подход к загрузке рабочих листов. Теперь я уверен, что один из вас, гуру, узнает, почему это сработало, и вышеупомянутый метод не сделал этого, но этот способ проще в любом случае для тех, кто хотел бы его использовать.

import xlrd

excel = 'path to my file'
book = xlrd.open_workbook(excel)


# get a list of work sheet names
sheetlist = []
for sheet in book.sheet_names():
    sheetlist.append(sheet)

# create and ordered dict of the worksheets
dfs = pd.read_excel(excel, sheetname=sheetlist)

df = pd.concat((df.assign(source=sheet) for sheet, df in dfs.items()), ignore_index=True)
df['API_NUM'] = df['API_NUM'].astype(str)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню