我有一个pandas数据帧(df)。
df有很多列和行,其中很多都是整数。
我的目的是将数据框保存为excel文件,并在保留数据完整性的同时再次将其读回。
我正在使用以下步骤。
writer = pd.ExcelWriter("myExcelFile.xlsx")
df.to_excel(writer, 'sheet_name')
writer.save()
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读取字符串,重新转换为整数来解决这个问题。但是,对我和我的应用来说,痛苦太严重了: - /
答案 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'>