【问题标题】:TypeError: 'float' object is not subscriptable in openpyxl function dataframe_to_rowsTypeError:'float' 对象在 openpyxl 函数 dataframe_to_rows 中不可下标
【发布时间】:2020-07-23 22:42:49
【问题描述】:

我正在使用 openpyxl 库中的 dataframe_to_rows 函数。 我正在尝试将数据框写入具有格式的现有空白工作表中。 但是,我遇到以下错误: TypeError : 'float' 对象不可下标

下面是相同的代码:

import openpyxl
from openpyxl.utils.dataframe import dataframe_to_rows

def copy_dataframe_to_file(file_path, df, sheet_name):

    wb = openpyxl.load_workbook(file_path)
    ws = wb[sheet_name]
    rows = dataframe_to_rows(df)    

    for r_idx, row in enumerate(rows, 1):
        for c_idx, value in enumerate(row, 1):
            ws.cell(row=r_idx, column=c_idx, value=value)

    ws.save(file_path)


Error Message Here: 

row = [data[j][idx] for j in range(ncols)] 
TypeError : 'float' object is not subscriptable

row = [data[j][idx] for j in range(ncols)] 来自库文件 openpyx.utils.dataframe.py。 我无法理解“浮动”的来源。

【问题讨论】:

  • 添加完整的回溯
  • data[j] 可能是浮点数,data[j][idx] 正在尝试访问浮点数的第 idx 个元素
  • df.head() 长什么样子?

标签: python pandas openpyxl


【解决方案1】:

出于测试目的,我在 openpyx.utils.dataframe.py 行 row = [data[j][idx] for j in range(ncols)] 之前添加了一条打印语句以获取data[j] 和 data[j][idx] 的值。

所以 data[j] 基本上等同于 dataframe/table 中的 column,它的类型是 list(字符串列表), data[j][idx] 是该列中第一行的值。 我能够打印第一列。 当下一列是 dataframe_to_rows 的浮点列表(实际上是整数列表,但转换为浮点列表)时,麻烦就开始了。这就是发生上述错误的地方。

在将整个数据帧传递给 dataframe_to_rows 之前,我通过下面的行将整个数据帧转换为字符串类型。

df = df.to_string()
rows = dataframe_to_rows(df)  

这样,错误就没有发生。但是,这会将所有空格转换为“nan”字符串,将整数转换为浮点数,例如102 到 102.0

为避免此问题,我必须先将整个数据框转换为类型“对象”,然后再使用带有下一行的 dataframe_to_rows 获取行。这解决了整数的 nan 值和浮点表示。

df = df.astype('object')
rows = dataframe_to_rows(df)  

【讨论】:

    猜你喜欢
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 2023-04-02
    相关资源
    最近更新 更多