学习 Python Pandas:快速入门与实战 – wiki大全

学习 Python Pandas:快速入门与实战

Python 在数据科学领域之所以能占据主导地位,很大程度上要归功于其强大的第三方库生态系统。在众多库中,Pandas 无疑是数据处理和分析的基石。无论你是数据分析师、数据科学家还是对数据处理感兴趣的开发者,掌握 Pandas 都是一项必备技能。

本文将带你从零开始,快速入门 Pandas 的核心概念,并通过实战案例巩ンド了解其在实际工作中的应用。

什么是 Pandas?为什么选择它?

Pandas 是一个开源的 Python 数据分析库,它提供了高性能、易于使用的数据结构和数据分析工具。它的名字来源于 “Panel Data”(面板数据)和 “Python Data Analysis”(Python 数据分析)。

为什么选择 Pandas?

  1. 高效的数据结构: Pandas 引入了两种核心数据结构:Series(一维带标签数组)和 DataFrame(二维带标签表格),它们能够高效地存储和操作大量数据。
  2. 强大的数据处理能力: 无论是数据清洗、转换、筛选、聚合还是合并,Pandas 都提供了直观且功能丰富的 API。
  3. 广泛的数据格式支持: 可以轻松读取和写入 CSV、Excel、SQL 数据库、JSON、HDF5 等多种数据格式。
  4. 与 NumPy 和 Matplotlib 完美结合: Pandas 构建于 NumPy 之上,利用了 NumPy 的高性能数组计算能力,同时也能与 Matplotlib 等可视化库无缝协作,进行数据探索和展示。
  5. 活跃的社区支持: 拥有庞大而活跃的社区,遇到问题时很容易找到解决方案和资源。

第一部分:快速入门 Pandas

1. 安装与导入

首先,确保你的 Python 环境中已经安装了 Pandas。如果还没有,可以通过 pip 进行安装:

bash
pip install pandas

在 Python 脚本或 Jupyter Notebook 中,通常会将其导入并使用约定俗成的别名 pd

python
import pandas as pd

2. Series:一维带标签数组

Series 是 Pandas 的基本一维数据结构,类似于带标签的数组,可以存储任何数据类型(整数、浮点数、字符串、Python 对象等)。它由两部分组成:数据和与之关联的索引(标签)。

创建 Series:

“`python

从列表创建

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

从字典创建,字典的键作为索引

data = {‘a’: 0., ‘b’: 1., ‘c’: 2.}
s2 = pd.Series(data)
print(s2)

输出:

a 0.0

b 1.0

c 2.0

dtype: float64

“`

Series 的基本操作:

你可以像操作 NumPy 数组一样进行索引和切片,也可以使用其标签进行操作:

“`python
print(s[0]) # 基于位置索引
print(s2[‘b’]) # 基于标签索引

print(s[1:4]) # 切片
“`

3. DataFrame:二维带标签表格

DataFrame 是 Pandas 中最常用的数据结构,它是一个二维的、大小可变的、异构的表格数据结构,可以看作是 Series 对象的集合,共享同一个索引。它类似于电子表格或 SQL 表。

创建 DataFrame:

“`python

从字典创建 DataFrame

data = {
‘Name’: [‘Alice’, ‘Bob’, ‘Charlie’, ‘David’],
‘Age’: [24, 27, 22, 32],
‘City’: [‘New York’, ‘Los Angeles’, ‘Chicago’, ‘Houston’]
}
df = pd.DataFrame(data)
print(df)

输出:

Name Age City

0 Alice 24 New York

1 Bob 27 Los Angeles

2 Charlie 22 Chicago

3 David 32 Houston

指定索引

df_indexed = pd.DataFrame(data, index=[‘a’, ‘b’, ‘c’, ‘d’])
print(df_indexed)

从列表的列表创建(需要指定列名)

data_list = [[‘Alice’, 24], [‘Bob’, 27]]
df_list = pd.DataFrame(data_list, columns=[‘Name’, ‘Age’])
print(df_list)
“`

加载外部数据:

Pandas 最强大的功能之一是轻松地从各种数据源加载数据。

“`python

从 CSV 文件加载

df_csv = pd.read_csv(‘your_data.csv’)

从 Excel 文件加载

df_excel = pd.read_excel(‘your_data.xlsx’, sheet_name=’Sheet1′)

“`

DataFrame 的基本检查:

加载数据后,通常需要快速了解其结构和内容。

“`python

查看前几行

print(df.head()) # 默认前5行,可指定行数,如 df.head(10)

查看后几行

print(df.tail()) # 默认后5行

获取 DataFrame 的简要信息,包括列名、非空值数量、数据类型和内存使用情况

print(df.info())

获取数值列的统计摘要,如计数、均值、标准差、最小值、最大值和四分位数

print(df.describe())

查看 DataFrame 的形状 (行数, 列数)

print(df.shape)

查看列名

print(df.columns)

查看索引

print(df.index)
“`

第二部分:核心功能与实战

1. 数据选择与筛选

列选择:

选择单列会返回一个 Series,选择多列会返回一个 DataFrame。

“`python

选择单列

names = df[‘Name’]
print(names)

选择多列

name_age = df[[‘Name’, ‘Age’]]
print(name_age)
“`

行选择:

  • .loc:基于标签(索引名称和列名)进行选择。
  • .iloc:基于整数位置进行选择。

“`python

使用 .loc 选择单行(基于索引标签)

row_a = df_indexed.loc[‘a’]
print(row_a)

使用 .iloc 选择单行(基于整数位置)

row_0 = df.iloc[0]
print(row_0)

使用 .loc 选择特定行和列

subset_loc = df_indexed.loc[[‘a’, ‘c’], [‘Name’, ‘Age’]]
print(subset_loc)

使用 .iloc 选择特定行和列

subset_iloc = df.iloc[[0, 2], [0, 1]]
print(subset_iloc)
“`

条件筛选:

根据条件选择满足特定条件的行。

“`python

筛选年龄大于 25 的人

older_than_25 = df[df[‘Age’] > 25]
print(older_than_25)

组合条件 (使用 & 表示 “AND”, | 表示 “OR”)

adults_in_ny = df[(df[‘Age’] >= 18) & (df[‘City’] == ‘New York’)]
print(adults_in_ny)
“`

2. 数据清洗与预处理

实际数据往往不规整,Pandas 提供了强大的工具来处理这些问题。

处理缺失值:

缺失值通常用 NaN (Not a Number) 表示。

“`python
import numpy as np

df_missing = pd.DataFrame({
‘A’: [1, 2, np.nan, 4],
‘B’: [np.nan, 6, 7, 8],
‘C’: [9, 10, 11, 12]
})
print(df_missing)

检查缺失值

print(df_missing.isnull()) # 返回布尔型 DataFrame
print(df_missing.isnull().sum()) # 每列的缺失值数量

删除含有缺失值的行

df_dropped_rows = df_missing.dropna()
print(df_dropped_rows)

删除含有缺失值的列

df_dropped_cols = df_missing.dropna(axis=1)
print(df_dropped_cols)

填充缺失值

df_filled_zero = df_missing.fillna(0) # 用 0 填充
print(df_filled_zero)

df_filled_mean = df_missing.fillna(df_missing.mean()) # 用每列的均值填充
print(df_filled_mean)
“`

删除重复值:

“`python
df_duplicates = pd.DataFrame({
‘col1’: [‘A’, ‘B’, ‘A’, ‘C’],
‘col2’: [1, 2, 1, 3]
})
print(df_duplicates)

df_no_duplicates = df_duplicates.drop_duplicates()
print(df_no_duplicates)

基于特定列删除重复项

df_no_duplicates_col1 = df_duplicates.drop_duplicates(subset=[‘col1’])
print(df_no_duplicates_col1)
“`

重命名列:

python
df_renamed = df.rename(columns={'Name': 'Full_Name', 'City': 'Location'})
print(df_renamed)

数据类型转换:

python
df['Age'] = df['Age'].astype(float) # 将 Age 列转换为浮点型
print(df.info())

3. 数据分组与聚合

groupby() 是 Pandas 中用于执行“分拆-应用-合并”操作的关键功能。它允许你根据一个或多个列的值将数据分组,然后对每个组应用聚合函数(如求和、均值、计数等)。

“`python
df_sales = pd.DataFrame({
‘Region’: [‘East’, ‘West’, ‘East’, ‘West’, ‘East’],
‘Product’: [‘A’, ‘B’, ‘A’, ‘C’, ‘B’],
‘Sales’: [100, 150, 120, 200, 180]
})
print(df_sales)

按 Region 分组并计算 Sales 总和

sales_by_region = df_sales.groupby(‘Region’)[‘Sales’].sum()
print(sales_by_region)

按 Region 和 Product 分组,计算平均 Sales

avg_sales_by_rp = df_sales.groupby([‘Region’, ‘Product’])[‘Sales’].mean()
print(avg_sales_by_rp)

使用 agg() 进行多个聚合操作

agg_sales = df_sales.groupby(‘Region’)[‘Sales’].agg([‘sum’, ‘mean’, ‘count’])
print(agg_sales)
“`

4. 合并与连接 DataFrame

当数据分布在多个 DataFrame 中时,Pandas 提供了 concat()merge() 来将它们组合起来。

pd.concat():沿轴堆叠 DataFrame。

“`python
df1 = pd.DataFrame({‘A’: [‘A0’, ‘A1’], ‘B’: [‘B0’, ‘B1’]})
df2 = pd.DataFrame({‘A’: [‘A2’, ‘A3’], ‘B’: [‘B2’, ‘B3’]})

df_concat = pd.concat([df1, df2]) # 默认按行堆叠 (axis=0)
print(df_concat)

df_concat_cols = pd.concat([df1, df2], axis=1) # 按列堆叠
print(df_concat_cols)
“`

pd.merge():类似于 SQL 的 JOIN 操作,根据一个或多个键列连接 DataFrame。

“`python
df_customers = pd.DataFrame({
‘customer_id’: [1, 2, 3, 4],
‘name’: [‘Alice’, ‘Bob’, ‘Charlie’, ‘David’]
})
df_orders = pd.DataFrame({
‘order_id’: [101, 102, 103, 104],
‘customer_id’: [2, 1, 4, 3],
‘amount’: [50, 75, 120, 90]
})

内连接 (默认),只保留两个 DataFrame 中都有的 customer_id

df_merged = pd.merge(df_customers, df_orders, on=’customer_id’)
print(df_merged)

左连接 (left join),保留左边 DataFrame 的所有行

df_left_merged = pd.merge(df_customers, df_orders, on=’customer_id’, how=’left’)
print(df_left_merged)
“`

5. 应用函数

apply() 方法允许你将自定义函数应用到 Series 或 DataFrame 的行/列上,实现更灵活的数据转换。

“`python
def categorize_age(age):
if age < 25:
return ‘Young’
else:
return ‘Adult’

df[‘Age_Category’] = df[‘Age’].apply(categorize_age)
print(df)
“`

第三部分:实战案例

假设我们有一份包含学生成绩的数据,我们需要进行以下分析:
1. 加载数据。
2. 查看数据概况。
3. 计算每个学生的总分。
4. 找出每个课程的平均分。
5. 找出总分最高的学生。

为了演示,我们先手动创建一个 CSV 文件 grades.csv

csv
Student,Math,Science,English
Alice,85,90,78
Bob,72,88,92
Charlie,90,75,85
David,60,65,70
Emily,95,92,90

“`python

Step 1: 加载数据 (假设 grades.csv 在当前目录下)

如果文件不存在,请先创建 grades.csv

with open(‘grades.csv’, ‘w’) as f:

f.write(“Student,Math,Science,English\n”)

f.write(“Alice,85,90,78\n”)

f.write(“Bob,72,88,92\n”)

f.write(“Charlie,90,75,85\n”)

f.write(“David,60,65,70\n”)

f.write(“Emily,95,92,90\n”)

df_grades = pd.read_csv(‘grades.csv’)
print(“原始数据:”)
print(df_grades)

Step 2: 查看数据概况

print(“\n数据概况:”)
print(df_grades.info())
print(“\n数值统计:”)
print(df_grades.describe())

Step 3: 计算每个学生的总分

df_grades[‘Total_Score’] = df_grades[‘Math’] + df_grades[‘Science’] + df_grades[‘English’]
print(“\n添加总分列后的数据:”)
print(df_grades)

Step 4: 找出每个课程的平均分

average_scores = df_grades[[‘Math’, ‘Science’, ‘English’]].mean()
print(“\n各科平均分:”)
print(average_scores)

Step 5: 找出总分最高的学生

top_student = df_grades.loc[df_grades[‘Total_Score’].idxmax()]
print(“\n总分最高的学生:”)
print(top_student)
“`

总结

Pandas 是一个功能极其强大的数据处理库,本文仅介绍了其最常用的一些功能。通过 SeriesDataFrame 这两个核心数据结构,以及丰富的数据选择、清洗、分组、合并和应用函数等操作,你可以高效地完成绝大多数数据分析任务。

进一步学习建议:

  • 官方文档: Pandas 官方文档是最好的学习资源。
  • 练习: 在 Kaggle 或 UCI Machine Learning Repository 等平台上寻找数据集进行实战练习。
  • 探索更多功能: 时间序列处理、窗口函数、透视表 (pivot_table) 等都是 Pandas 的高级但非常实用的功能。

希望本文能帮助你迈出学习 Pandas 的第一步,祝你在数据探索的旅程中一切顺利!

滚动至顶部