pandas dataframe:save&阅读excel表|将整数作为字符串处理

时间:2016-12-13 02:08:50

标签: python excel pandas dataframe

我有一个pandas数据帧(df)。

df有很多列和行,其中很多都是整数。

我的目的是将数据框保存为excel文件,并在保留数据完整性的同时再次将其读回。

我正在使用以下步骤。

保存到Excel:

writer = pd.ExcelWriter("myExcelFile.xlsx")

df.to_excel(writer, 'sheet_name')

writer.save()

从excel读取:

import glob

files = glob.glob("myExcelFile*.xlsx")  #gives list of files

myFile = files[0]

df = pd.read_excel(myFile , sheetname='sheet_name', convert_float=True)

请注意选项“ convert_float ”。 据说,excel以浮动格式保存所有数字。 所以这个选项应该有助于将所有浮点值转换为可能的整数。

例如,1.0 - > 1。

我的要求是获取我打算在此Excel工作表中保存的原始整数值,然后再检索。 然而,由于某种原因,这不起作用。 我在某个地方出错了吗?

在保存到Excel时,有没有办法可以处理?

我试图通过将整数变换为字符串,在excel中存储字符串,从excel读取字符串,重新转换为整数来解决这个问题。但是,对我和我的应用来说,痛苦太严重了: - /

1 个答案:

答案 0 :(得分:0)

我无法复制你的问题。它似乎对我很好:

import pandas as pd

df = pd.DataFrame({'Floats': [10.1, 20.2, 30.3, 20.0, 15.9, 30.1, 45.0],
                   'Integers': [10.0, 20.0, 30, 20, 15, 30, 45]})

filename = 'df.xlsx'

writer = pd.ExcelWriter(filename)
df.to_excel(writer)
writer.save()

df = pd.read_excel(filename, convert_float=True)
print df

结果:

   Floats  Integers
0    10.1        10
1    20.2        20
2    30.3        30
3    20.0        20
4    15.9        15
5    30.1        30
6    45.0        45

运行此代码时是否得到相同的结果?如果是这样,那么必然会有其他事情发生。你能给我们一些证明问题的代码吗?

请注意,每个列中至少包含一个浮点数的列将使整个列被视为浮点数,因为在给定列中通常不能有多个数据类型(请参阅下面有关object的内容)列类型)。

如果上述代码由于某种原因无法正常工作,那么一种解决方法是强制某些列和/或索引手动为整数,如下所示:

df = pd.read_excel(filename) # convert_float=False by default
df['Integers'] = df['Integers'].astype(int)
df.index = df.index.astype(int)
print df

你可以强制所有列都是这样的整数:

df = pd.read_excel(filename).astype(int)

在OP提供更多细节后进行编辑:

如果您知道哪些列需要被视为字符串,您可以使用上面相同的手动技术:

df['Strings'] = df['Strings'].astype(str)

但是你希望它更自动化。这很hacky,但它确实有效。如果在数据的末尾添加一个虚拟字符串,这些字符串显然是一个字符串,如'dummy',那么pandas会将列作为对象引入,每个元素都有自己的数据类型。如果没有虚拟字符串,它就不起作用。您可以在我的代码中尝试注释掉的数据框。

import pandas as pd

# This works.
df = pd.DataFrame({'Floats': [10.1, 20.2, 30.3, 20.0, 15.9, 30.1, 0],
                   'Objects': ['10.0', 20.0, 30.5, 20, 15, 30, 'dummy']})
# This doesn't work.
# df = pd.DataFrame({'Floats': [10.1, 20.2, 30.3, 20.0, 15.9, 30.1],
#                  'Objects': ['10.0', 20.0, 30.5, 20, 15, 30]})

filename = 'df.xlsx'

writer = pd.ExcelWriter(filename)
df.to_excel(writer)
writer.save()

# Remove the dummy row.
df = pd.read_excel(filename)[:-1] 

print df
print
print df.dtypes
print
print df.loc[0, 'Objects'], type(df.loc[0, 'Objects'])
print df.loc[1, 'Objects'], type(df.loc[1, 'Objects'])
print df.loc[2, 'Objects'], type(df.loc[2, 'Objects'])
print df.loc[3, 'Objects'], type(df.loc[3, 'Objects'])

结果:

   Floats Objects
0    10.1    10.0
1    20.2      20
2    30.3    30.5
3    20.0      20
4    15.9      15
5    30.1      30

Floats     float64
Objects     object
dtype: object

10.0 <type 'unicode'>
20 <type 'int'>
30.5 <type 'float'>
20 <type 'int'>