将一维 Numpy 数组作为行添加到 DataFrame

Posted

技术标签:

【中文标题】将一维 Numpy 数组作为行添加到 DataFrame【英文标题】:Add A 1-D Numpy Array to DataFrame as a Row 【发布时间】:2020-02-06 03:03:23 【问题描述】:

是否有一个函数可以让您有效地将 NumPy 数组直接附加到 DataFrame 中?

变量:

df = pd.DataFrame(columns=['col1', 'col2', 'col3'])

Out[1]: +------+------+------+
        | Col1 | Col2 | Col3 |
        +------+------+------+
        |      |      |      |
        +------+------+------+


arr = np.empty(3)

# array is populated with values. Random numbers are chosen in this example,
#    but in my program, the numbers are not arbitrary.
arr[0] = 756
arr[1] = 123
arr[2] = 452

Out[2]: array([756, 123, 452])

我如何直接将arr 附加到df 的末尾以获取此信息?

+------+------+------+
| Col1 | Col2 | Col3 |
+------+------+------+
|  756 |  123 |  452 |
+------+------+------+

我尝试过使用df.append(arr),但它不接受 NumPy 数组。我可以将 NumPy 数组转换为 DataFrame 然后附加它,但我认为这将非常低效,尤其是在数百万次迭代中。有没有更有效的方法?

【问题讨论】:

使用df.loc[len(df)] = arr @rafaelc 很快就会慢下来。一旦你的行数达到 10 万行,每行开始需要 10 毫秒,而且还有 90 万多行 @ALollz 但没有人说有一个 for 循环,我们在每次迭代时都附加 您能否提供更多有关您如何生成这些数字的信息?可能最好的解决方案是预先分配所有内容,相应地填充它,然后在最后构造 DataFrame。 【参考方案1】:

@rafaelc 注释只有在你的 Pandas DataFrame 索引从 0 到 len(df)-1 时才有效,因此它不是一般的解决方法,它很容易在你的代码中产生一个无声的错误。

如果您确定您的 Numpy 数组与您的 Pandas DataFrame 具有相同的列,您可以尝试使用 append 函数和 dict 理解,如下所示:

data_to_append = 
for i in range(len(df.columns)):
    data_to_append[df.columns[i]] = arr[i]
df = df.append(data_to_append, ignore_index = True)

您需要重新分配 DataFrame,因为append 函数不支持就地修改。

希望对你有帮助。

【讨论】:

【参考方案2】:

@BalrogOfMoira 真的比简单地创建要追加的数据框更快吗?

df.append(pd.DataFrame(arr.reshape(1,-1), columns=list(df)), ignore_index=True)

否则@Wonton,您可以简单地连接数组,然后写入数据帧,该数据帧可以附加到原始数据帧。

【讨论】:

如果 DataFrame 已经存在并填充了数据,这很有用。【参考方案3】:

这将起作用:

df.append(pd.DataFrame(arr).T)

【讨论】:

如果列索引是整数(并且列索引不是从零开始),则它不起作用。它将索引从零开始的列添加到 df.columns 中的最小索引,并将 arr 值仅分配给第一个 len(arr) 元素。

以上是关于将一维 Numpy 数组作为行添加到 DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

python数据分析模块:numpy、pandas全解

numpy.savetxt:将一维数组写入多行多列

Numpy - 将行添加到数组

如何使用 numpy 从一维数组创建对角矩阵?

将 NumPy 数组的第一维解压缩到 pyplot.plot

如何将 numpy 二维数组作为一种可以用 C++ 读取的二进制格式存储到磁盘上