Pandas
和 NumPy
是 Python 数据科学领域中最重要的两个库。Pandas
构建于 NumPy
之上,它们紧密结合,互为补充,能共同处理复杂的数据分析任务。NumPy
提供了高效的数组操作,而 Pandas
提供了面向数据分析的高级功能。以下是 Pandas
和 NumPy
结合使用时的常见场景和操作。
1. 使用 NumPy
创建 Pandas
对象
Pandas
中的 Series
和 DataFrame
可以直接使用 NumPy
数组或函数来创建。Pandas
本质上是对 NumPy
数组的一种封装,因此可以将 NumPy
数据直接转换为 Pandas
数据结构。
a) 用 NumPy
数组创建 Pandas
Series
import numpy as np
import pandas as pd
# 使用NumPy创建一个数组
np_array = np.array([10, 20, 30, 40])
# 将NumPy数组转换为Pandas的Series
s = pd.Series(np_array)
print(s)
# 输出:
# 0 10
# 1 20
# 2 30
# 3 40
# dtype: int64
b) 用 NumPy
数组创建 Pandas
DataFrame
# 使用NumPy创建一个二维数组
np_2d_array = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 将NumPy二维数组转换为Pandas的DataFrame
df = pd.DataFrame(np_2d_array, columns=['A', 'B', 'C'])
print(df)
# 输出:
# A B C
# 0 1 2 3
# 1 4 5 6
# 2 7 8 9
2. Pandas
与 NumPy
数据结构的互相转换
a) Pandas
对象转换为 NumPy
数组
Pandas
DataFrame
和 Series
可以很方便地转换为 NumPy
数组,以进行更高效的数值计算。
# 将DataFrame转换为NumPy数组
df_to_np = df.values
print(df_to_np)
# 输出:
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
b) Series
转换为 NumPy
数组
# 将Series转换为NumPy数组
s_to_np = s.values
print(s_to_np)
# 输出: [10 20 30 40]
通过将 Pandas
数据转换为 NumPy
数组,我们可以借助 NumPy
的强大数组计算能力,快速进行矩阵运算、广播等操作。
3. NumPy
数学函数与 Pandas
的结合
NumPy
中的大部分数学函数和统计函数可以直接应用于 Pandas
数据结构上,Pandas
会自动将这些函数广播到各个元素上。
a) 应用 NumPy
数学函数到 Pandas
对象
# 使用NumPy的sqrt函数
df_sqrt = np.sqrt(df)
print(df_sqrt)
# 输出:
# A B C
# 0 1.000000 1.414214 1.732051
# 1 2.000000 2.236068 2.449490
# 2 2.645751 2.828427 3.000000
b) 使用 NumPy
的 where
函数进行条件选择
NumPy
的 where()
函数可以根据条件对 Pandas
数据进行筛选或条件赋值。
# 使用NumPy的where进行条件选择
df_where = np.where(df > 4, 'High', 'Low')
print(df_where)
# 输出:
# [['Low' 'Low' 'Low']
# ['Low' 'High' 'High']
# ['High' 'High' 'High']]
c) 使用 NumPy
的聚合函数
NumPy
的聚合函数(例如 sum()
、mean()
、std()
等)也可以直接应用于 Pandas
对象。
# 使用NumPy的聚合函数计算平均值
df_mean = np.mean(df)
print(df_mean)
# 输出: [4. 5. 6.] (各列的平均值)
4. 利用 NumPy
进行高效的布尔索引和条件筛选
虽然 Pandas
自身提供了丰富的条件筛选功能,但 NumPy
的布尔索引和条件操作更加灵活,可以与 Pandas
结合进行数据处理。
# 生成布尔掩码
mask = df['A'] > 4
# 使用NumPy的布尔数组选择DataFrame中的行
filtered_df = df[mask]
print(filtered_df)
# 输出:
# A B C
# 1 4 5 6
# 2 7 8 9
5. Pandas
中使用 NumPy
的随机数生成器
NumPy
的随机数生成器是处理模拟和生成随机数据的重要工具,尤其在数据分析、数据科学和机器学习中。我们可以使用 NumPy
随机函数生成数据并将其加载到 Pandas
数据结构中。
# 生成随机数并加载到DataFrame
np_random_data = np.random.randn(5, 3)
df_random = pd.DataFrame(np_random_data, columns=['Col1', 'Col2', 'Col3'])
print(df_random)
# 输出一个5x3的随机DataFrame
6. 使用 Pandas
与 NumPy
结合进行数据清理
a) 使用 NumPy
的 nan
处理缺失值
NumPy
提供了 np.nan
来表示缺失值,Pandas
可以使用这个值来标记缺失数据,并且可以使用 fillna()
、dropna()
等函数处理这些数据。
# 创建包含缺失值的DataFrame
df_with_nan = pd.DataFrame({
'A': [1, 2, np.nan, 4],
'B': [5, np.nan, np.nan, 8]
})
print(df_with_nan)
# 使用Pandas的fillna填充缺失值
df_filled = df_with_nan.fillna(0)
print(df_filled)
# 输出:
# A B
# 0 1.0 5.0
# 1 2.0 0.0
# 2 0.0 0.0
# 3 4.0 8.0
b) 处理无效值:使用 NumPy
来替换异常值
我们可以结合 NumPy
和 Pandas
来识别并替换无效值。例如,使用 NumPy
中的 isnan()
函数识别缺失值或异常值,并用其他数据填充。
# 将小于2的值替换为缺失值 (np.nan)
df_replaced = df.where(df > 2, np.nan)
print(df_replaced)
# 输出:
# A B C
# 0 NaN NaN 3.0
# 1 4.0 5.0 6.0
# 2 7.0 8.0 9.0
7. 利用 NumPy
对 Pandas
进行高级数据分析
通过结合 NumPy
和 Pandas
,可以进行一些更复杂的计算和分析,例如矩阵运算、线性代数操作等。
a) 矩阵运算
# 创建一个随机的DataFrame
df_matrix = pd.DataFrame(np.random.rand(3, 3), columns=['A', 'B', 'C'])
# 使用NumPy的矩阵乘法
result = np.dot(df_matrix, df_matrix.T)
print(result)
# 输出:
# [[0.401 0.353 0.328]
# [0.353 0.405 0.331]
# [0.328 0.331 0.312]]
b) 线性代数操作
# 使用NumPy的线性代数函数计算行列式
det = np.linalg.det(df_matrix.values)
print(det)
# 输出:行列式值
8. Pandas
中的 NumPy
广播机制
NumPy
的广播机制使得向量化运算更加高效。这种机制在 Pandas
中也可以直接使用。
# 将某列乘以一个标量
df_broadcast = df * 2
print(df_broadcast)
# 输出:
# A B C
# 0 2 4 6
# 1 8 10 12
# 2 14 16 18
总结
Pandas
和 NumPy
在 Python 数据分析中结合得非常紧密,NumPy
提供了底层的高效计算,Pandas
则在此基础上提供了更加高级的功能来处理和分析数据。通过结合 Pandas
和 NumPy
,我们可以更灵活地执行复杂的数据分析、数据清理、条件筛选、矩阵运算等任务。