Python技术升华之旅

收藏Python编程的知识、技巧和最佳实践

Python数据科学:使用Pandas和NumPy进行数据分析

数据科学是当今最热门的领域之一,而Python已成为数据科学家的首选语言。本文将介绍如何使用Python的两个核心数据科学库——Pandas和NumPy进行数据分析。

数据科学简介

数据科学是一个跨学科领域,它结合了统计学、计算机科学和领域专业知识,从数据中提取有价值的见解。数据科学的典型工作流程包括:

  1. 数据收集
  2. 数据清洗和预处理
  3. 探索性数据分析
  4. 建立模型
  5. 结果可视化和解释

NumPy:科学计算的基础

NumPy(Numerical Python)是Python科学计算的基础库,提供了高性能的多维数组对象和处理这些数组的工具。

安装NumPy

pip install numpy

NumPy数组基础

import numpy as np

# 创建数组
arr1 = np.array([1, 2, 3, 4, 5])
print(arr1)  # 输出: [1 2 3 4 5]

# 创建二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2)
# 输出:
# [[1 2 3]
#  [4 5 6]]

# 数组属性
print(arr2.shape)  # 输出: (2, 3)
print(arr2.dtype)  # 输出: int64

# 创建特殊数组
zeros = np.zeros((3, 4))  # 3x4的全0数组
ones = np.ones((2, 3))    # 2x3的全1数组
rand = np.random.random((2, 2))  # 2x2的随机数组

NumPy数组操作

# 数组运算
arr = np.array([1, 2, 3, 4])
print(arr + 10)  # 输出: [11 12 13 14]
print(arr * 2)   # 输出: [2 4 6 8]

# 数组间运算
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
print(arr1 + arr2)  # 输出: [5 7 9]
print(arr1 * arr2)  # 输出: [4 10 18]

# 统计函数
arr = np.array([1, 2, 3, 4, 5])
print(np.mean(arr))  # 输出: 3.0
print(np.max(arr))   # 输出: 5
print(np.min(arr))   # 输出: 1
print(np.sum(arr))   # 输出: 15

# 数组切片
arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(arr[3:7])  # 输出: [3 4 5 6]

# 二维数组切片
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr[0:2, 1:3])
# 输出:
# [[2 3]
#  [5 6]]

Pandas:数据分析的瑞士军刀

Pandas是基于NumPy的数据分析库,提供了高性能、易用的数据结构和数据分析工具。Pandas的两个主要数据结构是Series(一维)和DataFrame(二维)。

安装Pandas

pip install pandas

Pandas Series

import pandas as pd

# 创建Series
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s)
# 输出:
# 0    1.0
# 1    3.0
# 2    5.0
# 3    NaN
# 4    6.0
# 5    8.0
# dtype: float64

# 带索引的Series
s = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
print(s)
# 输出:
# a    1
# b    2
# c    3
# d    4
# dtype: int64

# 通过字典创建Series
d = {'a': 1, 'b': 2, 'c': 3}
s = pd.Series(d)
print(s)
# 输出:
# a    1
# b    2
# c    3
# dtype: int64

Pandas DataFrame

# 创建DataFrame
df = pd.DataFrame({
    'A': [1, 2, 3, 4],
    'B': pd.Timestamp('20230101'),
    'C': pd.Series(1, index=list(range(4)), dtype='float32'),
    'D': np.array([3] * 4, dtype='int32'),
    'E': pd.Categorical(["test", "train", "test", "train"]),
    'F': 'foo'
})
print(df)
# 输出:
#    A          B    C  D      E    F
# 0  1 2023-01-01  1.0  3   test  foo
# 1  2 2023-01-01  1.0  3  train  foo
# 2  3 2023-01-01  1.0  3   test  foo
# 3  4 2023-01-01  1.0  3  train  foo

# 查看DataFrame信息
print(df.dtypes)  # 显示每列的数据类型
print(df.head())  # 显示前几行
print(df.tail(3))  # 显示后3行
print(df.index)   # 显示索引
print(df.columns) # 显示列名
print(df.describe()) # 显示统计摘要

数据选择和过滤

# 选择单列
print(df['A'])

# 选择多列
print(df[['A', 'B']])

# 选择行(按位置)
print(df.iloc[0])  # 第一行
print(df.iloc[0:3])  # 前三行
print(df.iloc[0:3, 0:2])  # 前三行,前两列

# 选择行(按标签)
print(df.loc[0])  # 索引为0的行
print(df.loc[0:2, ['A', 'C']])  # 索引0到2的行,A和C列

# 条件选择
print(df[df['A'] > 2])  # A列值大于2的行

数据清洗

# 处理缺失值
df = pd.DataFrame({
    'A': [1, 2, np.nan, 4],
    'B': [5, np.nan, np.nan, 8],
    'C': [9, 10, 11, 12]
})

# 检查缺失值
print(df.isnull())
print(df.isnull().sum())  # 每列缺失值的数量

# 删除缺失值
print(df.dropna())  # 删除包含任何缺失值的行
print(df.dropna(axis=1))  # 删除包含任何缺失值的列

# 填充缺失值
print(df.fillna(0))  # 用0填充所有缺失值
print(df.fillna(df.mean()))  # 用列平均值填充缺失值

数据转换和聚合

# 数据转换
df = pd.DataFrame({
    'A': [1, 2, 3, 4],
    'B': [5, 6, 7, 8]
})

# 应用函数到列
print(df['A'].apply(lambda x: x * 2))

# 应用函数到整个DataFrame
print(df.apply(np.sqrt))  # 计算每个元素的平方根

# 分组和聚合
df = pd.DataFrame({
    'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar'],
    'B': ['one', 'one', 'two', 'three', 'two', 'two'],
    'C': [1, 2, 3, 4, 5, 6],
    'D': [10, 20, 30, 40, 50, 60]
})

# 按A列分组,计算C列的平均值
print(df.groupby('A')['C'].mean())

# 按A和B列分组,计算C和D列的总和
print(df.groupby(['A', 'B']).sum())

数据合并

# 创建两个DataFrame
df1 = pd.DataFrame({
    'A': ['A0', 'A1', 'A2', 'A3'],
    'B': ['B0', 'B1', 'B2', 'B3'],
    'key': ['K0', 'K1', 'K0', 'K1']
})

df2 = pd.DataFrame({
    'C': ['C0', 'C1', 'C2', 'C3'],
    'D': ['D0', 'D1', 'D2', 'D3'],
    'key': ['K0', 'K1', 'K2', 'K3']
})

# 合并(类似SQL的join)
print(pd.merge(df1, df2, on='key'))  # 内连接
print(pd.merge(df1, df2, on='key', how='left'))  # 左连接
print(pd.merge(df1, df2, on='key', how='right'))  # 右连接
print(pd.merge(df1, df2, on='key', how='outer'))  # 外连接

# 连接(按行或列)
print(pd.concat([df1, df2], axis=0))  # 按行连接
print(pd.concat([df1, df2], axis=1))  # 按列连接

数据可视化

Pandas与Matplotlib集成,可以轻松创建数据可视化:

import matplotlib.pyplot as plt

# 创建示例数据
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2023', periods=1000))
ts = ts.cumsum()

# 绘制折线图
ts.plot()
plt.title('随机漫步')
plt.show()

# 创建DataFrame示例数据
df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=['A', 'B', 'C', 'D'])
df = df.cumsum()

# 绘制多列折线图
df.plot()
plt.show()

# 绘制柱状图
df2 = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df2.plot.bar()
plt.show()

# 绘制堆叠柱状图
df2.plot.bar(stacked=True)
plt.show()

# 绘制直方图
df['A'].plot.hist(bins=50)
plt.show()

# 绘制散点图
df.plot.scatter(x='A', y='B')
plt.show()

实际案例:分析销售数据

让我们通过一个实际案例来展示如何使用Pandas和NumPy进行数据分析:

# 假设我们有一个销售数据CSV文件
# 首先读取数据
sales_data = pd.read_csv('sales.csv')

# 查看数据基本信息
print(sales_data.info())
print(sales_data.describe())

# 检查缺失值
print(sales_data.isnull().sum())

# 填充缺失值
sales_data['quantity'] = sales_data['quantity'].fillna(sales_data['quantity'].mean())

# 按产品类别分组,计算销售总额
category_sales = sales_data.groupby('category')['sales_amount'].sum().sort_values(ascending=False)
print(category_sales)

# 按月份分析销售趋势
sales_data['date'] = pd.to_datetime(sales_data['date'])
sales_data['month'] = sales_data['date'].dt.month
monthly_sales = sales_data.groupby('month')['sales_amount'].sum()
print(monthly_sales)

# 可视化月度销售趋势
monthly_sales.plot(kind='bar')
plt.title('月度销售趋势')
plt.xlabel('月份')
plt.ylabel('销售额')
plt.show()

# 分析最畅销的产品
top_products = sales_data.groupby('product_name')['quantity'].sum().sort_values(ascending=False).head(10)
print(top_products)

# 可视化最畅销产品
top_products.plot(kind='barh')
plt.title('最畅销的10种产品')
plt.xlabel('销售数量')
plt.show()

结论

Pandas和NumPy是Python数据科学生态系统的核心组件,掌握这两个库可以帮助您高效地处理和分析数据。本文介绍了这两个库的基础用法,包括数据结构、数据操作、清洗、转换、聚合和可视化等方面。

随着您的不断学习和实践,您可以进一步探索更高级的数据分析技术,如时间序列分析、机器学习等。Python的数据科学生态系统非常丰富,除了Pandas和NumPy外,还有Matplotlib、Seaborn(可视化)、Scikit-learn(机器学习)、TensorFlow和PyTorch(深度学习)等库可以学习。

祝您在数据科学的旅程中取得成功!