【问题标题】:Writing a list to new excel xlsx with dataframes使用数据框将列表写入新的 excel xlsx
【发布时间】:2017-12-07 17:27:42
【问题描述】:

我在寻找将列表写入加载的 Excel 工作表然后将结果另存为 xlsx 的最佳方法时遇到了一些麻烦。我希望我的代码做的是获取我创建的列表并将它们放在加载的工作簿的特定列中。我认为使用数据框可能有一种更简单的方法来做到这一点,但我不知道如何。理想情况下,我想保存已加载工作簿的格式。

col_test = [1L, 2L, 3L, 4L, 5L]

我的代码是这样的

import xlrt
from xlrd import open_workbook
rb = open_workbook("Excel FDT Master_01_update.xlsx")
s = rb.sheet_by_name('INPUT')
r = 5
for test in col_test:
    s.cell(row = r, column = 1).value = test
    r += 1
rb.save('didthiswork.xlsx')

【问题讨论】:

    标签: python excel for-loop openpyxl xlrd


    【解决方案1】:

    该错误意味着 Python 在 cell 的定义中找不到名为 row 的参数。如果我没记错的话,这是 xlrd 模块。让我们看一下您尝试在此处调用的 Sheet.cell() 的 API 文档。

    cell(rowx, colx)
    

    给定行和列中的单元格对象。

    您似乎只是错误地命名了参数。将行更改为以下内容应该可以解决此问题。

    s.cell(rowx = r, colx = 1).value = test
    

    不言而喻,Python 无法猜测您要输入的内容,因此,当您确定某些内容不存在时(例如此处的参数名称)出现错误时,请务必阅读文档并检查错别字。此外,在以后发布您可以找到的所有相关信息,例如函数定义和您正在使用的模块的名称。

    【讨论】:

      【解决方案2】:

      这是一个在 anaconda 之上没有额外安装的版本。 它不保留样式,但您可以通过复制/“粘贴值”恢复到原始 xlsx 来修复。

      大多数 excel 操纵器在保持原始文件完好无损方面存在问题。也有一些方法可以解决这个问题,但如果你想让它防水,你基本上最终会为你找到一个特定的解决方案,或者或多或少地重新编码所有库,所以不值得努力。

      在扩展现有数据帧时,要正确处理 Pandas 可能有点棘手,但总有几种替代方法可以做到这一点。这里是用assign完成的,所以只需要确保dataframe的rowcount足够长就可以添加。

      import pandas as pd
      
      # read the excel
      df = pd.read_excel('Geen titel 1.xlsx') # there are options to choose sheet
      print('original df')
      print(df)
      # your data is not valid python syntax so let's assume it's strings
      col_test = ['1L', '2L', '3L', '4L', '5L']
      new_idx = range(max(len(col_test), len(df.index)))
      df = df.reindex(new_idx) # now it will accommodate different lengths
      print('reindexed df')
      print(df)
      df = df.assign(new_col=col_test) # new column added at right side
      print('modified df')
      print(df)
      df.to_excel('the_new.xlsx')
      

      打印输出:

      original df
         a  b
      0  1  c
      1  2  d
      2  3  e
      reindexed df
           a    b
      0  1.0    c
      1  2.0    d
      2  3.0    e
      3  NaN  NaN
      4  NaN  NaN
      modified df
           a    b new_col
      0  1.0    c      1L
      1  2.0    d      2L
      2  3.0    e      3L
      3  NaN  NaN      4L
      4  NaN  NaN      5L
      

      【讨论】:

      • 有没有办法可以改变这一点,以便 new_column 替换列 a 而不是添加为新列,更具体地说,它可以开始写入特定行,比如第 6 行吗?
      • 您可以分配给您想要的任何列,所以df.assign(a=col_test) 会这样做。我确实建议您学习有关 pandas 的众多教程之一,该文档包含很好的选择/索引示例,或者 jupyter 笔记本,或者 youtube 上的视频,人们可以通过这些视频了解基础知识。如果您想在特定行上执行此操作,您可以预先选择 df 的一部分并替换这些值,它会变得有点不同。您只能替换 df 现有大小/形状内的值,因此如果您要添加的是扩展,则应首先增加大小/形状。
      • 或在开头添加 None 到您的 col_test 中,这与向下移动行相同,这将是覆盖,但您也可以使用原始的而不是 None来自原始 df 的值并将其放在那里,考虑到您似乎不熟悉 python/pandas,这对您来说可能更容易。
      猜你喜欢
      • 2021-08-24
      • 2023-03-15
      • 2013-11-29
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      • 2018-08-13
      相关资源
      最近更新 更多