python - 如何在不复制的情况下从单个 1D Numpy 数组构造 Pandas DataFrame

标签 python pandas numpy dataframe cython

与我能找到的所有其他问题不同,我不想从同类 Numpy 数组创建 DataFrame,也不想将结构化数组转换为 DataFrame。

我想要的是从每个列的单独一维 Numpy 数组创建一个 DataFrame。我尝试了明显的 DataFrame({"col": nparray, "col": nparray}) ,但这显示在我个人资料的顶部,所以它一定是在做一些非常慢的事情。

据我了解,Pandas DataFrames 是用纯 Python 实现的,其中每一列都由一个 Numpy 数组支持,所以我认为有一种有效的方法可以做到这一点。

我实际上想做的是从 Cython 有效地填充 DataFrame。 Cython 具有允许高效访问 Numpy 数组的内存 View 。 所以我的策略是分配一个 Numpy 数组,用数据填充它,然后把它放在一个 DataFrame 中。

相反的工作非常好,从 Pandas DataFrame 创建内存 View 。因此,如果有一种方法可以预分配整个 DataFrame,然后将列传递给 Cython,这也是可以接受的。

cdef int32_t[:] data_in = df['data_in'].to_numpy(dtype="int32")

我的代码配置文件的一部分看起来像这样,代码所做的一切都与最后创建的 DataFrame 完全相形见绌。

         1100546 function calls (1086282 primitive calls) in 4.345 seconds

   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    4.345    4.345 profile:0(<code object <module> at 0x7f4e693d1c90, file "test.py", line 1>)
    445/1    0.029    0.000    4.344    4.344 :0(exec)
        1    0.006    0.006    4.344    4.344 test.py:1(<module>)
     1000    0.029    0.000    2.678    0.003 :0(run_df)
     1001    0.017    0.000    2.551    0.003 frame.py:378(__init__)
     1001    0.018    0.000    2.522    0.003 construction.py:170(init_dict)

对应代码:

def run_df(self, df):
    cdef int arx_rows = len(df)
    cdef int arx_idx

    cdef int32_t[:] data_in = df['data_in'].to_numpy(dtype="int32")

    data_out_np = np.zeros(arx_rows, dtype="int32")
    cdef int32_t[:] data_out = data_out_np

    for arx_idx in range(arx_rows):
        self.cpp_sec_par.run(data_in[arx_idx],data_out[arx_idx],)

    return pd.DataFrame({
        'data_out': data_out_np,
    })

最佳答案

pandas.DataFrame ({"col": nparray, "col": nparray})

如果您改为尝试 list (nparray),这会起作用。这是一个通用示例:

import numpy as np
import pandas as pd

alpha = np.array ([1, 2, 3])
beta = np.array ([4, 5, 6])
gamma = np.array ([7, 8, 9])

dikt = {"Alpha" : list (alpha), "Beta" : list (beta), "Gamma":list (gamma)}

data_frame = pd.DataFrame (dikt)
print (data_frame)

关于python - 如何在不复制的情况下从单个 1D Numpy 数组构造 Pandas DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54982378/

相关文章:

python - 如何在seaborn中设置子图的标题和ylims

python - 如何在 pandas 方括号内的字符串之间添加逗号

python - (Python) 对矩阵列的赋值返回全零

python - 提取包含另一个数组元素的端点数组行的矢量化方法

python - 重新采样 - 无法单独创建训练集和测试集

python - python 中 subprocess.Popen() 打开的连接应该关闭吗

python - Amazon EC2 实例上的 pyvirtualdisplay

python - 重新插入 DataFrame,使其与另一个(非常相关的)DataFrame 对齐

python - 在稀疏矩阵中取对数函数的有效方法

python - 无法替换序列化 TextView 中的数据,字节数组大小问题?