【问题标题】:pandas dataframe : save & read excel sheet | handling integers as stringspandas 数据框:保存和读取 excel 表 |将整数作为字符串处理
【发布时间】:2016-12-13 23:47:21
【问题描述】:

我有一个熊猫数据框 (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 中读取字符串、重新转换为整数来解决这个问题。但是,对我和我的应用程序来说,痛苦都太严重了:-/

【问题讨论】:

  • 我有两个澄清问题。你想从 excel 中读取浮点数作为整数吗?另外,您使用的是哪个版本的熊猫?

标签: python excel pandas dataframe


【解决方案1】:

我无法复制您的问题。这对我来说似乎很好用:

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'>

【讨论】:

  • 太棒了!谢谢!也许现在我会尝试更精确......我的意思如下......我在(df)中有字符串列,它们只是数字。一旦我将 df 保存到 excel 中,它们就会转换为浮点数。在读回 excel 时,即使我使用 convert_float=True,浮点数仍然是浮点数。 df['Integers'] = df['Integers'].astype(int) 很有帮助,但我想避免过于明确。所以问题是......我如何保留“字符串”数字而不将它们转换为从 excel 读回的浮点数?
  • 哦,好的。我编辑了我的答案以解决字符串转换为浮点数的问题。
猜你喜欢
  • 1970-01-01
  • 2021-01-05
  • 2018-06-05
  • 2017-09-18
  • 2020-01-29
  • 2018-09-12
  • 1970-01-01
  • 2017-06-22
  • 2020-02-04
相关资源
最近更新 更多