python_for_data_analysis_2nd_chinese_version核心指南:从NumPy到pandas的数据分析实战
你还在为数据处理效率低下而烦恼吗?还在为表格数据整理而头疼吗?本文将带你从NumPy的数组计算到pandas的表格处理,一站式掌握Python数据分析的核心技能。读完本文,你将能够:
- 使用NumPy进行高效的数值计算
- 掌握pandas的Series和DataFrame数据结构
- 熟练进行数据清洗、筛选和转换操作
- 理解向量化运算带来的性能提升
NumPy:数值计算的基石
NumPy(Numerical Python的简称)是Python数值计算最重要的基础包。大多数提供科学计算的包都是用NumPy的数组作为构建基础。NumPy的核心是ndarray(N维数组对象),它是一个快速而灵活的大数据集容器。
创建ndarray数组
创建数组最简单的办法就是使用array函数。它接受一切序列型的对象(包括其他数组),然后产生一个新的含有传入数据的NumPy数组。
import numpy as np
# 从列表创建一维数组
data1 = [6, 7.5, 8, 0, 1]
arr1 = np.array(data1)
print(arr1) # 输出: [6. 7.5 8. 0. 1.]
# 从嵌套列表创建二维数组
data2 = [[1, 2, 3, 4], [5, 6, 7, 8]]
arr2 = np.array(data2)
print(arr2)
# 输出:
# [[1 2 3 4]
# [5 6 7 8]]
除了np.array,还有一些函数也可以新建数组,如zeros、ones、empty和arange等:
# 创建全0数组
np.zeros(10) # 一维数组
np.zeros((3, 6)) # 二维数组
# 创建全1数组
np.ones((2, 3, 2)) # 三维数组
# 创建一个没有任何具体值的数组
np.empty((2, 3))
# arange是Python内置函数range的数组版
np.arange(15) # 输出: [ 0 1 2 ... 12 13 14]
详细的数组创建方法可以参考第04章 NumPy基础:数组和矢量计算.md。
矢量化运算
NumPy数组使你可以将许多种数据处理任务表述为简洁的数组表达式(否则需要编写循环)。用数组表达式代替循环的做法,通常被称为矢量化。一般来说,矢量化数组运算要比等价的纯Python方式快上一两个数量级(甚至更多)。
# 创建一个2x3的随机数组
data = np.random.randn(2, 3)
print(data)
# 输出示例:
# [[-0.2047 0.4789 -0.5194]
# [-0.5557 1.9658 1.3934]]
# 所有元素乘以10
print(data * 10)
# 输出示例:
# [[ -2.047 4.789 -5.194]
# [ -5.557 19.658 13.934]]
# 元素级加法
print(data + data)
# 输出示例:
# [[-0.4094 0.9578 -1.0388]
# [-1.1114 3.9316 2.7868]]
数组索引与切片
NumPy数组的索引是一个内容丰富的主题,因为选取数据子集或单个元素的方式有很多。
# 一维数组索引
arr = np.arange(10)
print(arr[5]) # 输出: 5
print(arr[5:8]) # 输出: [5 6 7]
# 二维数组索引
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr2d[2]) # 输出: [7 8 9]
print(arr2d[0, 2]) # 输出: 3 (等价于arr2d[0][2])
# 布尔型索引
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
data = np.random.randn(7, 4)
# 选择名字为'Bob'的所有行
print(data[names == 'Bob'])
pandas:表格数据处理利器
pandas是本书后续内容的首选库。它含有使数据清洗和分析工作变得更快更简单的数据结构和操作工具。pandas经常和其它工具一同使用,如数值计算工具NumPy和SciPy,分析库statsmodels和scikit-learn,和数据可视化库matplotlib。
Series数据结构
Series是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。
import pandas as pd
# 创建Series
obj = pd.Series([4, 7, -5, 3])
print(obj)
# 输出:
# 0 4
# 1 7
# 2 -5
# 3 3
# dtype: int64
# 创建带有索引的Series
obj2 = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
print(obj2)
# 输出:
# d 4
# b 7
# a -5
# c 3
# dtype: int64
# 通过索引访问元素
print(obj2['a']) # 输出: -5
print(obj2[['c', 'a', 'd']]) # 输出多个元素
更多关于Series的操作可以参考第05章 pandas入门.md。
DataFrame数据结构
DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。
# 创建DataFrame
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
frame = pd.DataFrame(data)
print(frame)
# 输出:
# pop state year
# 0 1.5 Ohio 2000
# 1 1.7 Ohio 2001
# 2 3.6 Ohio 2002
# 3 2.4 Nevada 2001
# 4 2.9 Nevada 2002
# 5 3.2 Nevada 2003
# 查看前几行数据
print(frame.head())
# 选择特定列
print(frame['state'])
print(frame[['year', 'state']])
# 通过标签选择行
print(frame.loc[2])
# 添加新列
frame['debt'] = np.arange(6.)
print(frame)
数据对齐
pandas最重要的一个功能是,它可以对不同索引的对象进行算术运算。在将对象相加时,如果存在不同的索引对,则结果的索引就是该索引对的并集。
s1 = pd.Series([7.3, -2.5, 3.4, 1.5], index=['a', 'c', 'd', 'e'])
s2 = pd.Series([-2.1, 3.6, -1.5, 4, 3.1], index=['a', 'c', 'e', 'f', 'g'])
# 自动对齐索引并相加
print(s1 + s2)
# 输出:
# a 5.2
# c 1.1
# d NaN
# e 0.0
# f NaN
# g NaN
# dtype: float64
从NumPy到pandas:数据处理流程
数据加载与准备
在实际数据分析中,我们通常需要从外部文件加载数据。pandas提供了多种数据读取函数,如read_csv、read_excel等。
# 读取CSV文件
# df = pd.read_csv('data.csv')
# 读取Excel文件
# df = pd.read_excel('data.xlsx')
数据清洗与转换
数据清洗是数据分析过程中非常重要的一步,包括处理缺失值、异常值、重复值等。
# 检查缺失值
# print(df.isnull().sum())
# 填充缺失值
# df.fillna(df.mean(), inplace=True)
# 删除重复值
# df.drop_duplicates(inplace=True)
数据筛选与排序
pandas提供了灵活的数据筛选和排序功能。
# 条件筛选
# filtered = df[df['pop'] > 2.0]
# 排序
# sorted_df = df.sort_values(by='year')
数据聚合与分组
pandas的groupby功能可以实现数据的分组聚合操作。
# 按州分组计算人口平均值
# state_pop = frame.groupby('state')['pop'].mean()
# print(state_pop)
实际案例:数据分析流程
下面我们通过一个简单的案例来展示从NumPy到pandas的完整数据分析流程。
1. 数据生成
首先,我们使用NumPy生成一些模拟数据:
# 生成时间序列数据
dates = pd.date_range('20230101', periods=100)
data = np.random.randn(100, 4)
df = pd.DataFrame(data, index=dates, columns=list('ABCD'))
2. 数据探索
对数据进行初步探索:
# 查看数据基本信息
print(df.info())
# 查看统计摘要
print(df.describe())
# 查看前几行数据
print(df.head())
3. 数据可视化
虽然本文不详细介绍可视化,但值得一提的是,pandas可以与matplotlib无缝集成:
# 绘制数据走势图
# df.plot()
4. 数据分析
进行一些简单的数据分析:
# 计算各列之间的相关性
print(df.corr())
# 计算滚动平均值
print(df.rolling(window=5).mean())
总结与展望
本文介绍了python_for_data_analysis_2nd_chinese_version项目中NumPy和pandas的核心功能。从NumPy的高效数组计算到pandas的灵活表格处理,这些工具为数据分析提供了强大的支持。
要深入学习数据分析,建议继续阅读项目中的其他章节:
通过掌握这些工具和技术,你将能够更高效地处理和分析数据,为决策提供有力支持。数据分析是一个不断发展的领域,持续学习和实践是提升技能的关键。
希望本文能够帮助你更好地理解和使用python_for_data_analysis_2nd_chinese_version项目中的内容。如果你有任何问题或建议,欢迎参与项目的社区讨论。
别忘了点赞、收藏、关注三连,以便获取更多数据分析相关的优质内容!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



