Python将多个Excel工作表合并到数据框中

时间:2018-07-31 16:47:15

标签: python pandas

我有一个包含10个工作表的Excel文件。有些工作表有数据,有些工作表是空的,但这会定期更改,包括第一个和/或最后一个工作表。

使用Python 2.7,我正在做的是将所有工作表加载到pandas df中,以在另一个函数中进行处理。我还添加了带有工作表名称的列。加载工作表似乎工作正常,但是我的一列中有14-20个字符的值,长度以0结尾。因此,当我打印出dict时,它们看起来正确,但是pandas正在转换为科学计数法,因此我不知道如何保留这些值。

这是一些字典数据:

           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 Scientific会标明该数字。

但是-这毕竟可以正常工作-

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写到csv中,该列的末尾有0掉了。

问题是,稍后在另一个函数中,我创建了这些值的字符串列表以进行sql查询。所以稍后,它看起来像:

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

和我正在运行查询的字段是一个字符串字段。




编辑:      我相信lambda函数毕竟可以工作了,这是由于数据错误以及我自己给我带来的问题。因此该方法或下面的方法将起作用。这对于希望使用Python将工作表合并到df中的人很有帮助

1 个答案:

答案 0 :(得分: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)