如何将一个Numpy数组列表转换为Pandas DataFrame

14

我有一个像这样的Numpy数组列表:

[400.31865662]
[401.18514808]
[404.84015554]
[405.14682194]
[405.67735105]
[273.90969447]
[274.0894528]

当我尝试使用以下代码将其转换为Pandas Dataframe时

y = pd.DataFrame(data)
print(y)

当我打印它时,我得到了以下输出。为什么会出现这些零?

            0
0  400.318657
            0
0  401.185148
            0
0  404.840156
            0
0  405.146822
            0
0  405.677351
            0
0  273.909694
            0
0  274.089453

我想获取一个单列的数据框,它长得像这样:

400.31865662
401.18514808
404.84015554
405.14682194
405.67735105
273.90969447
274.0894528

你一定在做其他的事情,因为我得到了预期的结果。在创建DataFrame之前,data看起来是什么样子?它看起来像每个项目都是自己的DataFrame。 - Andrew
我无法重现你的错误,请提供print(data)的输出?一个数据帧需要有一个索引(行指示器)和一个列名(列指示器)。如果你没有提供它们,pandas会自动创建它们:当调用print(df)时,你应该看到0、1、2..在行中,并且看到0在列中。如果你只想看到数据,请使用y.values - Tarifazo
问题出在你的数组上:array = np.array(np.random.randn(5)) 然后 pd.DataFrame(array)。像预期的一样工作。 - It_is_Chris
你说得对,Andrew(数据)确实是一个数组列表,我没有意识到。那么我该如何将它们聚合成一个单一的数组,以便可以将其转换为Pandas数据框? - Yannick
由于(数据)实际上是一个数组列表,我尝试了以下代码:newdf = pd.DataFrame(data) newdf.to_csv('test.csv',mode='w', sep=',',header=False,index=False)我得到的结果只有列表中的最后一个数组,即274.08945279667057。如何将数组列表连接到同一个文件中? - Yannick
4个回答

21

你可以使用flatten函数来降维numpy数组:

import numpy as np
import pandas as pd

data = [[400.31865662],
        [401.18514808],
        [404.84015554],
        [405.14682194],
        [405.67735105],
        [273.90969447],
        [274.0894528]]

arr = np.array(data)

df = pd.DataFrame(data=arr.flatten())

print(df)

输出

            0
0  400.318657
1  401.185148
2  404.840156
3  405.146822
4  405.677351
5  273.909694
6  274.089453

1
这并没有真正解决问题,因为即使您不将数据展平,pd.DataFrame(data)也可以正常工作。问题在于其他地方,这可能或可能没有最终解决提问者的问题。 - cs95
1
以上都是很好的答案,还有一件事可以做的是,如果有帮助的话,可以添加列名 df = pd.DataFrame(data=arr.flatten(), columns=['Values']) - Pramit

16

我假设此帖的许多访问者并非来处理楼主的具体且无法重现的问题,这里是通用答案


df = pd.DataFrame(array)

pandas的优势在于其对于用户友好(就像Excel),因此使用列名称非常重要。

import numpy as np
import pandas as pd

array = np.random.rand(5, 5)
array([[0.723, 0.177, 0.659, 0.573, 0.476],
       [0.77 , 0.311, 0.533, 0.415, 0.552],
       [0.349, 0.768, 0.859, 0.273, 0.425],
       [0.367, 0.601, 0.875, 0.109, 0.398],
       [0.452, 0.836, 0.31 , 0.727, 0.303]])
columns = [f'col_{num}' for num in range(5)]
index = [f'index_{num}' for num in range(5)]

这就是魔法发生的地方:

df = pd.DataFrame(array, columns=columns, index=index)
            col_0     col_1     col_2     col_3     col_4
index_0  0.722791  0.177427  0.659204  0.572826  0.476485
index_1  0.770118  0.311444  0.532899  0.415371  0.551828
index_2  0.348923  0.768362  0.858841  0.273221  0.424684
index_3  0.366940  0.600784  0.875214  0.108818  0.397671
index_4  0.451682  0.836315  0.310480  0.727409  0.302597

5

还有一种方式,其他回答中并未提到。如果你有一个 NumPy 数组,它本质上是一个行向量(或列向量),即形状类似于 (n, ),那么你可以按照以下方法操作:

# sample array
x = np.zeros((20))
# empty dataframe
df = pd.DataFrame()
# add the array to df as a column
df['column_name'] = x

通过这种方式,您可以将多个数组作为单独的列添加。


4
我刚刚发现了我的错误。 (data) 是一个数组列表:
[array([400.0290173]), array([400.02253235]), array([404.00252113]), array([403.99466754]), array([403.98681395]), array([271.97896036]), array([271.97110677])]

所以我使用了 np.vstack(data) 来连接它
conc = np.vstack(data)

[[400.0290173 ]
 [400.02253235]
 [404.00252113]
 [403.99466754]
 [403.98681395]
 [271.97896036]
 [271.97110677]]

然后我通过使用concatenated数组将其转换为Pandas Dataframe。

newdf = pd.DataFrame(conc)


    0
0  400.029017
1  400.022532
2  404.002521
3  403.994668
4  403.986814
5  271.978960
6  271.971107

现在完成了!


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