【问题标题】:How to paste a Numpy array to Excel如何将 Numpy 数组粘贴到 Excel
【发布时间】:2020-12-15 08:13:01
【问题描述】:

我有多个使用 Numpy 和 SciPy 处理的文件,但我需要提供 Excel 文件。如何有效地将庞大的 numpy 数组复制/粘贴到 Excel?

我尝试转换为 Pandas 的 DataFrame 对象,它具有非常有用的函数to_clipboard(excel=True),但我大部分时间都在将数组转换为 DataFrame。

我不能简单地将数组写入 CSV 文件,然后在 excel 中打开它,因为我必须将数组添加到现有文件中;使用 xlrd/xlwt 和其他 Excel 工具很难实现。

【问题讨论】:

  • 将数组转换为pandas.DataFrame 时遇到了什么问题?它应该像df = pandas.DataFrame(yourarray) 一样简单。
  • 没有问题,只是执行df = pandas.DataFrame(data=data)df.to_clipboard(excel=True)需要很长时间。另外,我真的不需要列名和行索引。

标签: python excel numpy


【解决方案1】:

我最好的解决方案是将数组转换为字符串,然后使用win32clipboard 将其发送到剪贴板。这不是一个跨平台的解决方案,但话说回来,Excel 并不是在每个平台上都可用。

Excel 使用制表符 (\t) 标记列更改,\r\n 指示行更改。

相关代码为:

import win32clipboard as clipboard

def toClipboardForExcel(array):
    """
    Copies an array into a string format acceptable by Excel.
    Columns separated by \t, rows separated by \n
    """
    # Create string from array
    line_strings = []
    for line in array:
        line_strings.append("\t".join(line.astype(str)).replace("\n",""))
    array_string = "\r\n".join(line_strings)

    # Put string into clipboard (open, clear, set, close)
    clipboard.OpenClipboard()
    clipboard.EmptyClipboard()
    clipboard.SetClipboardText(array_string)
    clipboard.CloseClipboard()

我已经用形状随机数组 (1000,10000) 测试了这段代码,最大的瓶颈似乎是将数据传递给函数。 (当我在函数开头添加print 语句时,我仍然需要稍等片刻才能打印任何内容。)

编辑: 上一段讲述了我在 Visual Studio 的 Python 工具方面的经验。在这种环境下,看起来打印语句被延迟了。在直接命令行界面中,瓶颈在循环中,正如预期的那样。

【讨论】:

  • 嗯。你把你的print声明放在哪里了?对我来说这似乎很奇怪,因为 Python 中的函数参数总是只是指针。也就是说,你不传递array的内容,你传递它的内存地址。
  • 你是对的,当我在 iPython 中尝试这个时(print 紧跟在 def ... 行之后),没有延迟。当我在 Visual Studio 的 Python 工具的交互式窗口中尝试此操作时,只有一个。在 iPython 中,瓶颈在于循环。我会相应地修改我的答案。
  • 对我来说,这会将数组中的数字拆分为单个数字、小数点 (.) 和其他符号(例如 e)。例如,0.12345e-06 数组中的一个值以 0.1、...、e-06 的形式粘贴到 Excel 中的单独列中.
【解决方案2】:
    import pandas as pd
    pd.DataFrame(arr).to_clipboard()

我认为这是使用 pandas 包最简单的方法之一。

【讨论】:

    【解决方案3】:

    如果我需要处理加载到 python 中的多个文件,然后解析为 excel,我可能会使用 xlwt 制作一些工具

    也就是说,我可以提供我的食谱Pasting python data into a spread sheet 以接受任何编辑、投诉或反馈。它不使用第三方库,应该是跨平台的。

    【讨论】:

      【解决方案4】:

      从今天开始,您也可以使用xlwings。它是开源的,并且与 Numpy 数组和 Pandas DataFrames 完全兼容。

      【讨论】:

        【解决方案5】:

        我将 PhilMacKay 的答案扩展为: - 包括一维数组,并且, - 允许逗号作为小数分隔符(decimal=","):

        import win32clipboard as clipboard
        
        def to_clipboard(array, decimal=","):
            """
            Copies an array into a string format acceptable by Excel.
            Columns separated by \t, rows separated by \n
            """
            # Create string from array
            try:
                n, m = np.shape(array)
            except ValueError:
                n, m = 1, 0
            line_strings = []
            if m > 0:
                for line in array:
                    if decimal == ",":
                        line_strings.append("\t".join(line.astype(str)).replace(
                            "\n","").replace(".", ","))
                    else:
                        line_strings.append("\t".join(line.astype(str)).replace(
                            "\n",""))
                array_string = "\r\n".join(line_strings)
            else:
                if decimal == ",":
                    array_string = "\r\n".join(array.astype(str)).replace(".", ",")
                else:
                    array_string = "\r\n".join(array.astype(str))
            # Put string into clipboard (open, clear, set, close)
            clipboard.OpenClipboard()
            clipboard.EmptyClipboard()
            clipboard.SetClipboardText(array_string)
            clipboard.CloseClipboard()
        

        【讨论】:

          【解决方案6】:

          您也可以查看pyxll 项目。

          【讨论】:

          • 是的,看起来很棒。看来这个产品真的可以提高 Excel 的实用性和 Python 的用户群!但就我目前的目的而言,我不喜欢许可......
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多