Python数据科学分析的核心是掌握NumPy和Pandas。NumPy提供高效的N维数组和向量化计算,奠定性能基础;Pandas在此之上构建DataFrame和Series,实现数据清洗、转换、分析的高效操作。两者协同工作,NumPy负责底层数值计算,Pandas提供高层数据结构与操作,广泛应用于数据预处理、聚合、筛选等任务。实际应用中需注意数据类型、广播规则、性能优化及内存管理,避免apply()等低效操作,理解SettingWithCopyWarning等机制。通过结合二者优势,可高效完成从基础处理到复杂分析的全流程。

Python进行数据科学分析,核心在于掌握Pandas和NumPy这两个库。它们就像是数据处理领域的左右手:NumPy提供了高效的数值计算能力和基础的数据结构,是所有高级操作的基石;而Pandas则在此之上构建,以其强大的DataFrame和Series对象,极大地简化了数据清洗、处理、转换和分析的整个流程,让复杂的数据操作变得直观且高效。
要真正上手使用Python进行数据科学分析,我们需要从NumPy和Pandas的基础操作开始。这不仅仅是学习语法,更是理解它们背后处理数据的方式。
首先,确保你的环境中安装了这两个库。通常,一个简单的
pip install pandas numpy
NumPy:数组与向量化计算
立即学习“Python免费学习笔记(深入)”;
NumPy(Numerical Python)是Python科学计算的核心库,它引入了N维数组对象(ndarray),并提供了大量用于处理这些数组的函数。在我看来,NumPy的魅力在于其对性能的极致追求,它将许多操作下放到C语言层面,使得大规模数值计算速度惊人。
import numpy as np
# 创建NumPy数组
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print("一维数组:", arr1)
print("二维数组:\n", arr2)
# 基本运算,这是NumPy最强大的地方——向量化操作
# 数组与标量运算
print("数组+5:", arr1 + 5)
# 数组与数组运算(对应元素相加)
arr3 = np.array([10, 20, 30, 40, 50])
print("数组相加:", arr1 + arr3)
# 形状操作
print("arr2的形状:", arr2.shape)
arr2_reshaped = arr2.reshape(3, 2)
print("arr2重塑后:\n", arr2_reshaped)
# 索引与切片
print("arr1的第二个元素:", arr1[1])
print("arr2的第一行:", arr2[0, :]) # 或者 arr2[0]
print("arr2的第二列:", arr2[:, 1])NumPy的向量化操作意味着你不需要写显式的循环来对数组中的每个元素进行操作,这不仅代码更简洁,效率也更高。
Pandas:数据框与结构化数据
Pandas是建立在NumPy之上的一个库,它提供了两种核心数据结构:Series(一维带标签数组)和DataFrame(二维带标签表格)。对我来说,DataFrame简直是数据分析师的“瑞士军刀”,它把我们习惯的电子表格或数据库表的概念带到了Python中,而且功能强大到超乎想象。
import pandas as pd
# 创建Series
s = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
print("Series:\n", s)
# 创建DataFrame
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, 30, 28, 35],
'城市': ['北京', '上海', '广州', '深圳'],
'分数': [85, 92, 78, 95]
}
df = pd.DataFrame(data)
print("\nDataFrame:\n", df)
# 查看数据概览
print("\nDataFrame头部:\n", df.head(2))
print("\nDataFrame信息:\n")
df.info()
print("\nDataFrame统计描述:\n", df.describe())
# 选择列
print("\n选择'姓名'列:\n", df['姓名'])
print("\n选择多列:\n", df[['姓名', '年龄']])
# 选择行(通过标签.loc或位置.iloc)
print("\n选择第一行(通过位置):\n", df.iloc[0])
print("\n选择索引为1和3的行:\n", df.iloc[[1, 3]])
# 条件筛选
print("\n年龄大于30的数据:\n", df[df['年龄'] > 30])
# 添加新列
df['是否及格'] = df['分数'] >= 60
print("\n添加'是否及格'列后:\n", df)
# 数据排序
print("\n按年龄降序排序:\n", df.sort_values(by='年龄', ascending=False))
# 处理缺失值(示例,这里没有缺失值)
# df_with_nan = df.copy()
# df_with_nan.loc[0, '分数'] = np.nan
# print("\n含有缺失值的DataFrame:\n", df_with_nan)
# print("\n缺失值数量:\n", df_with_nan.isnull().sum())
# print("\n删除缺失值行:\n", df_with_nan.dropna())
# print("\n填充缺失值:\n", df_with_nan.fillna(0))
# 聚合操作
print("\n按城市分组,计算平均分数:\n", df.groupby('城市')['分数'].mean())通过这些基础操作,我们已经能对数据进行初步的探索、清洗和转换。实际工作中,数据往往是脏乱的,Pandas的这些功能是数据预处理阶段不可或缺的利器。
在我看来,NumPy在数据处理中的核心地位,主要源于其对N维数组对象(ndarray)的引入和向量化操作的强大支持。设想一下,如果你有一百万个数字需要同时乘以2,用Python原生的列表和循环,你会发现速度慢得让人抓狂。但NumPy的ndarray就能在毫秒级别完成这项任务。
这背后有几个关键原因:
for
arr + 5
arr
arr1 * arr2
让我们看一个简单的例子,对比一下Python列表和NumPy数组的性能差异:
import time
list_data = list(range(1, 1000001)) # 100万个数字
numpy_data = np.arange(1, 1000001)
# 使用Python列表进行操作
start_time = time.time()
result_list = [x * 2 for x in list_data]
end_time = time.time()
print(f"Python列表操作耗时: {end_time - start_time:.4f} 秒")
# 使用NumPy数组进行操作
start_time = time.time()
result_numpy = numpy_data * 2
end_time = time.time()
print(f"NumPy数组操作耗时: {end_time - start_time:.4f} 秒")运行这段代码,你会发现NumPy的速度优势是压倒性的。这种效率提升,对于处理大型数据集时至关重要。可以说,没有NumPy,Pandas的强大功能也无从谈起,因为Pandas的DataFrame内部就是基于NumPy数组构建的。NumPy为Python在科学计算领域取得今天的地位,奠定了坚实的基础。
如果说NumPy是数据处理的“发动机”,那么Pandas DataFrame就是“整车”,它把数据组织得井井有条,并提供了各种方便的工具。我个人觉得,称DataFrame为“数据分析的瑞士军刀”一点也不为过,因为它几乎涵盖了数据分析过程中所有可能遇到的基本操作。
DataFrame最核心的优势在于它提供了一个带标签的二维表格结构,这与我们日常接触的Excel表格、SQL数据库表非常相似。它有行索引(index)和列名(columns),可以存储不同类型的数据(整数、浮点数、字符串、布尔值等),并且能方便地进行各种操作:
loc
iloc
isnull()
dropna()
fillna()
drop_duplicates()
astype()
groupby()
mean()
sum()
count()
median()
merge()
join()
concat()
举个例子,假设我们有一个销售数据DataFrame,我们想看看每个产品的平均销售额,并找出销售额最高的城市。
data_sales = {
'产品': ['A', 'B', 'A', 'C', 'B', 'A', 'C'],
'城市': ['北京', '上海', '广州', '北京', '深圳', '上海', '广州'],
'销售额': [120, 150, 130, 90, 200, 110, 80],
'销量': [10, 15, 12, 8, 20, 11, 7]
}
df_sales = pd.DataFrame(data_sales)
print("原始销售数据:\n", df_sales)
# 按产品分组,计算平均销售额
avg_sales_by_product = df_sales.groupby('产品')['销售额'].mean()
print("\n按产品分组的平均销售额:\n", avg_sales_by_product)
# 按城市分组,计算总销售额,并找到销售额最高的城市
total_sales_by_city = df_sales.groupby('城市')['销售额'].sum()
print("\n按城市分组的总销售额:\n", total_sales_by_city)
highest_sales_city = total_sales_by_city.idxmax()
print(f"\n销售额最高的城市是: {highest_sales_city},总销售额为: {total_sales_by_city.max()}")通过几行简洁的代码,我们就完成了复杂的聚合和分析。这种效率和直观性,正是Pandas DataFrame成为数据分析领域不可或缺工具的原因。它不仅提供了强大的功能,更重要的是,它以一种非常“Pythonic”的方式,让数据处理和分析变得更加愉快和高效。
在实际的数据科学项目中,Pandas和NumPy并非独立存在,它们是紧密协作的。Pandas的DataFrame和Series对象内部实际上是基于NumPy数组构建的,这意味着你可以在Pandas对象上直接应用NumPy的函数,或者将Pandas对象转换为NumPy数组进行更底层的数值计算。这种无缝集成是它们强大力量的来源。
考虑一个场景:我们有一个包含用户体征数据(身高、体重)的DataFrame,需要计算每个用户的BMI(身体质量指数),并识别出BMI异常的用户。BMI的计算公式是:体重(公斤)/ 身高(米)的平方。
# 假设数据是厘米和公斤
user_data = {
'用户ID': [1, 2, 3, 4, 5],
'身高_cm': [175, 160, 180, 165, 170],
'体重_kg': [70, 55, 90, 60, 65]
}
df_users = pd.DataFrame(user_data)
print("原始用户数据:\n", df_users)
# 步骤1: 将身高从厘米转换为米 (Pandas操作)
df_users['身高_m'] = df_users['身高_cm'] / 100
# 步骤2: 计算BMI (NumPy与Pandas协作)
# 这里直接在Pandas Series上进行NumPy风格的向量化操作
df_users['BMI'] = df_users['体重_kg'] / (df_users['身高_m'] ** 2)
# 步骤3: 根据BMI判断健康状况 (Pandas条件筛选)
# 假设BMI < 18.5 为偏瘦,18.5-24.9 为正常,>= 25 为超重
def classify_bmi(bmi):
if bmi < 18.5:
return '偏瘦'
elif 18.5 <= bmi < 25:
return '正常'
else:
return '超重'
# 使用apply方法,对BMI列的每个元素应用自定义函数
# 注意:对于大型数据集,尽量避免使用apply,优先使用向量化操作
df_users['健康状况'] = df_users['BMI'].apply(classify_bmi)
print("\n计算BMI及健康状况后的用户数据:\n", df_users)在这个例子中,
df_users['身高_cm'] / 100
df_users['体重_kg'] / (df_users['身高_m'] ** 2)
** 2
然而,这种协作也伴随着一些挑战,特别是对于初学者:
df['col'].astype(int)
apply()
df.apply()
np.where()
map()
SettingWithCopyWarning
.loc
int8
int64
在我看来,掌握NumPy和Pandas不仅仅是学习API,更重要的是理解它们背后的设计哲学和工作原理。只有这样,你才能在面对实际数据问题时,游刃有余地选择最有效、最高效的工具和方法。
以上就是如何使用Python进行数据科学分析(Pandas, NumPy基础)?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号