Numpy 如何高效地从 Numpy 3D 数组中创建 Pandas DataFrame
在本文中,我们将介绍如何使用 Numpy 和 Pandas 将 Numpy 3D 数组有效地转换为 Pandas DataFrame。这是数据科学中非常常见的操作,在将数据从各种格式和源中合并到一起并对其进行分析和可视化时,Pandas DataFrame 是不可或缺的。
阅读更多:Numpy 教程
Numpy 和 Pandas 的简介
在我们开始深入研究转换过程之前,让我们简要介绍一下 Numpy 和 Pandas。
NumPy 是Python中进行科学计算的核心库。它提供了一个高级数组对象、广播功能、集成 C/C++和 Fortran 代码的工具,以及众多的科学计算函数。
请看下面的示例。要使用 Numpy,您需要安装它:
import numpy as np
# Create array
arr = np.array([1, 2, 3, 4, 5])
# Print array
print(arr)
结果将是:
[1 2 3 4 5]
另一方面,Pandas 是基于 Numpy 的另一个非常有用的库。它允许用户读取和操作包含标签行和列的表格数据,类似于 SQL 或 Excel 中的表。
要使用 Pandas,您需要使用以下命令安装:
!pip install pandas
然后运行以下代码:
import pandas as pd
# Create dataframe with dictionary
data = {'name': ['John', 'Emma', 'Peter'], 'age': [30, 28, 25]}
df = pd.DataFrame(data)
# Print dataframe
print(df)
结果将是:
name age
0 John 30
1 Emma 28
2 Peter 25
看起来还是不错的。接下来,我们将介绍如何从 Numpy 3D 数组中创建 Pandas DataFrame。
创建 Numpy 3D 数组
首先,我们需要创建一个 Numpy 3D 数组。一个典型的 3D 数组由多个二维矩阵组成,其中每个矩阵可以是相同或不同的大小。例如,考虑以下示例:
import numpy as np
# Create 3D array
data = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(data)
结果将是:
array([[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]]])
请注意,此示例使用一个包含两个 2×2 矩阵的 3D 数组。现在我们有了一个 Numpy 3D 数组,下一步是将其转换为 Pandas DataFrame。
将 Numpy 3D 数组转换为 Pandas DataFrame
我们可以通过简单地重组 Numpy 3D 数组来创建 Pandas DataFrame。概括地说,我们将首先将所有矩阵转换为 Pandas DataFrame,然后将它们连接在一起形成一个大型 DataFrame。下面是转换过程的代码:
import numpy as np
import pandas as pd
# Create 3D array
data = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
# Convert each 2D matrix into a Pandas DataFrame
dfs = [pd.DataFrame(x) for x in data]
# Concatenate all Pandas DataFrames into one large DataFrame
df_final = pd.concat(dfs, keys=range(len(dfs)))
print(df_final)
结果将是:
0 1
0 0 1 2
1 3 4
1 0 5 6
1 7 8
请注意,Pandas DataFrame 的每行都与 Numpy 3D 数组中的每个元素对应。我们还可以使用 Pandas 中的 MultiIndex 概念轻松地添加多个索引。
import numpy as np
import pandas as pd
# Create 3D array
data = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
# Convert each 2D matrix into a Pandas DataFrame
dfs = [pd.DataFrame(x) for x in data]
# Create MultiIndex with 3 levels
indices = pd.MultiIndex.from_product([range(s) for s in data.shape])
# Concatenate all Pandas DataFrames into one large DataFrame
df_final = pd.concat(dfs, keys=indices)
print(df_final)
现在,结果将是一个带有三级索引的 DataFrame。
0 1
0 0 0 1 2
1 3 4
1 0 5 6
1 7 8
我们已经将 Numpy 3D 数组成功转换为 Pandas DataFrame。让我们用一些更实际的数据来看看如何去做。
示例:从数据文件创建 Numpy 3D 数组并转换为 Pandas DataFrame
假设我们有一些气象记录数据,记录了每小时降雨量、气温和风速。我们想将这些数据转换为 Pandas DataFrame 以进行分析。
首先,我们将从文件中读取数据并将其存储在一个 Numpy 3D 数组中。在这个例子中,我们将使用 numpy.loadtxt() 函数从文本文件中读取数据。
import numpy as np
# Load data from file
filename = 'weather_data.txt'
with open(filename, 'r') as f:
data = np.loadtxt(f)
# Reshape data into 3D array
data = data.reshape((4, 24, 3))
print(data)
首先,我们使用 open() 和 numpy.loadtxt() 从文件中读取数据。在这个例子中,文件包含四个天的数据,每天有24个小时和三个变量降雨量、气温和风速。数据被加载到一个一维数组中,我们将其转换为 4x24x3 的大小,并在最后一行打印数据以确保它正确加载。
下一步是将 Numpy 3D 数组转换为 Pandas DataFrame。我们需要创建一个 DataFrame 对象,其中每行对应于 Numpy 数组中一个小时的记录。
import numpy as np
import pandas as pd
# Load data from file
filename = 'weather_data.txt'
with open(filename, 'r') as f:
data = np.loadtxt(f)
# Reshape data into 3D array
data = data.reshape((4, 24, 3))
# Convert 3D array into Pandas DataFrame
dfs = [pd.DataFrame(data[i], columns=['Rainfall', 'Temp', 'Wind']) for i in range(data.shape[0])]
indices = pd.MultiIndex.from_product([range(s) for s in data.shape])
df = pd.concat(dfs, keys=indices)
print(df)
在这里,我们首先创建了 Pandas 对象,并将其保存在名为 dfs 的列表中。每个数据框包含一个小时的记录,具有三个列名:Rainfall、Temp 和 Wind。
我们还创建了一个 MultiIndex 对象 indices,以将日期、小时和变量添加到索引中,以便于后续的分析。
最后,我们使用 concat() 函数将 dfs 中的所有数据框连接起来,并将索引设置为 MultiIndex 对象 indices。
输出如下所示:
Rainfall Temp Wind
0 0 0 0.00 14.5 2.0
1 0.25 15.0 1.5
2 0.00 13.5 1.0
3 0.00 12.0 1.5
... ... ... ...
3 23 20 0.00 23.0 3.0
21 0.00 22.5 3.0
22 0.00 22.0 2.5
23 0.00 21.5 2.5
[288 rows x 3 columns]
现在,我们已经成功地将 Numpy 3D 数组转换为 Pandas DataFrame,可以用来进行更进一步的数据分析了。
总结
在本文中,我们介绍了如何使用 Numpy 和 Pandas 将 Numpy 3D 数组有效地转换为 Pandas DataFrame。通过简单的重组,我们可以将 Numpy 数组中的每个矩阵转换为一个 Pandas 数据框,并将它们连接在一起形成一个更大的数据框。
我们还展示了如何使用 MultiIndex 对象在 Pandas 中创建分层索引,以便于后续的数据分析。
在您的下一个数据科学项目中,如果您需要从 Numpy 3D 数组中创建 Pandas DataFrame,请尝试使用本文中介绍的方法来提高您的效率。
极客教程