如何将 Numpy 数组转换为 Panda DataFrame
Posted
技术标签:
【中文标题】如何将 Numpy 数组转换为 Panda DataFrame【英文标题】:How to convert Numpy array to Panda DataFrame 【发布时间】:2019-05-17 20:47:29 【问题描述】:我有一个如下所示的 Numpy 数组:
[400.31865662]
[401.18514808]
[404.84015554]
[405.14682194]
[405.67735105]
[273.90969447]
[274.0894528]
当我尝试使用以下代码将其转换为 Panda 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
我无法重现您的错误,您可以发布print(data)
吗?数据框需要有一个索引(行指示符)和一个列名(列指示符)。如果你不提供它们,pandas 会自动创建它们:调用print(df)
时,你应该会在行中看到 0,1,2..,在列中看到 0。如果您只想查看数据,请使用y.values
问题出在您的阵列上:array = np.array(np.random.randn(5))
然后pd.DataFrame(array)
。按预期工作。
你说得对安德鲁(数据)确实是我没有意识到的数组列表。那么如何将它们聚合到一个数组中,以便将其转换为 Pandas 数据框?
As (data) 实际上是一个数组列表我尝试了以下代码:newdf = pd.DataFrame(data) newdf.to_csv('test.csv',mode='w', sep=',',header=False,index=False)
我得到的结果只是列表的最后一个数组274.08945279667057
。如何将数组列表连接到同一个文件中?
【参考方案1】:
由于我假设这篇文章的许多访问者不是因为 OP 的特定和不可重现的问题,这里是一个一般性的答案:
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
【讨论】:
【参考方案2】:还有另一种方法,其他答案中没有提到。如果你有一个 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
这样您可以将多个数组添加为单独的列。
【讨论】:
【参考方案3】:我刚刚发现我的错误。 (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]]
然后我使用
将串联数组转换为 Pandas Dataframenewdf = 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
等等!
【讨论】:
【参考方案4】:你可以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
【讨论】:
这并不能真正解决问题,因为即使您不展平数据,pd.DataFrame(data)
也可以工作。问题是别的,这可能最终解决了 OP 的问题,也可能没有。
以上所有很棒的答案,如果有帮助,可以做的另一件事是添加列名df = pd.DataFrame(data=arr.flatten(), columns=['Values'])
以上是关于如何将 Numpy 数组转换为 Panda DataFrame的主要内容,如果未能解决你的问题,请参考以下文章