如何将Numpy数组粘贴到Excel中

7
我有多个文件需要使用Numpy和SciPy进行处理,但我需要提供一个Excel文件。如何高效地将大型numpy数组复制/粘贴到Excel中?
我已经尝试将其转换为Pandas的DataFrame对象,它具有非常有用的函数to_clipboard(excel=True),但我花费了大量时间将数组转换为DataFrame。
我不能简单地将数组写入CSV文件,然后在Excel中打开它,因为我必须将数组添加到现有文件中;这是使用xlrd/xlwt和其他Excel工具非常难以实现的。

你在将数组转换为 pandas.DataFrame 时遇到了什么问题?这应该很简单,只需要使用 df = pandas.DataFrame(yourarray) 即可。 - Joe Kington
没有问题,只是执行df = pandas.DataFrame(data=data)df.to_clipboard(excel=True)需要很长时间。而且,我不需要列名和行索引。 - PhilMacKay
6个回答

13

我最好的解决方案是将数组转换为字符串,然后使用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语句时,在它打印任何内容之前我仍然需要等待一会儿。)

编辑:上面的段落描述了我在Python Tools for Visual Studio中的体验,在这个环境中,打印语句好像有延迟。在直接命令行界面下,瓶颈在循环中,如预期。

1
嗯,你把print语句放在哪里了?对我来说,这似乎很奇怪,因为在Python中函数参数总是指针。也就是说,你不是传递array的内容,而是传递它的内存地址,所以它不应该花费任何明显的时间。 - John Y
你说得对,在iPython中尝试这个(在def ...行后面加上print),没有延迟。只有当我在Python Tools for Visual Studio的交互式窗口中尝试时才会有延迟。在iPython中,瓶颈在于循环。我会相应地修改我的答案。 - PhilMacKay
对我来说,这将数组中的数字拆分为单个数字、小数点(.)和其他符号(例如e)。例如,数组中的值0.12345e-06被粘贴到Excel中时,会被拆分成独立的列:0.1、...、e-06 - Confounded

8
    import pandas as pd
    pd.DataFrame(arr).to_clipboard()

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


1
如果我需要处理加载到Python中并解析成Excel的多个文件,我可能会使用 xlwt创建一些工具。
话虽如此,我想提供我的配方将Python数据粘贴到电子表格中供任何编辑、投诉或反馈。它不使用第三方库,应该是跨平台的。

1

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


0
我对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()

-1

你也可以看看pyxll项目。


是的,看起来很不错。这个产品似乎真的可以提高Excel的实用性和Python的用户群!但是对于我的当前目的,我不喜欢许可证... - PhilMacKay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接