Pandas 教程:核心概念与实战介绍
Pandas 是 Python 中一个强大且灵活的数据分析和处理库。它提供了一系列高性能、易于使用的数据结构和数据分析工具,是数据科学、机器学习和数据工程领域不可或缺的利器。无论您是处理结构化数据、进行数据清洗、转换还是聚合,Pandas 都能让您的工作事半功倍。
为什么选择 Pandas?
- 易用性: Pandas 提供了直观的 API,使得复杂的数据操作变得简单。
- 灵活性: 它可以处理各种数据类型,并能与 NumPy、Matplotlib、Scikit-learn 等其他数据科学库无缝集成。
- 高性能: Pandas 底层基于 NumPy 构建,能够实现快速高效的数据操作。
- 多功能性: 支持从多种文件格式(如 CSV、Excel、JSON、SQL 数据库)导入和导出数据。
安装与导入
在开始使用 Pandas 之前,您需要先安装它(如果尚未安装),然后将其导入到您的 Python 环境中。
bash
pip install pandas
python
import pandas as pd
核心数据结构:Series 和 DataFrame
Pandas 主要使用两种核心数据结构:Series 和 DataFrame。
-
Series: 一维带标签的数组,能够容纳任何数据类型(整数、字符串、Python 对象等)。您可以将其视为电子表格中的单列数据或一个带标签的数组。
-
DataFrame: 二维带标签的数据结构,其列可以具有不同的数据类型。它类似于电子表格、SQL 表或
Series对象的字典,提供了一种带有标签行和列的表格化数据视图。
创建 DataFrame
您可以从多种来源创建 DataFrame,包括字典、列表或读取外部文件。
从字典创建
python
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 28],
'City': ['New York', 'Los Angeles', 'Chicago', 'Houston']
}
df = pd.DataFrame(data)
print(df)
输出:
Name Age City
0 Alice 25 New York
1 Bob 30 Los Angeles
2 Charlie 35 Chicago
3 David 28 Houston
从 CSV 文件读取
从 CSV(逗号分隔值)文件读取数据是导入数据到 DataFrame 最常见的方式之一。
“`python
假设您有一个名为 ‘sample.csv’ 的文件
内容如下:
Name,Age,City
Alice,25,New York
Bob,30,Los Angeles
Charlie,35,Chicago
df_csv = pd.read_csv(‘sample.csv’)
print(df_csv)
“`
数据概览
一旦您有了 DataFrame,您会希望检查其内容和结构。
head(n): 显示 DataFrame 的前n行(默认为 5 行)。tail(n): 显示 DataFrame 的后n行(默认为 5 行)。info(): 提供 DataFrame 的简洁摘要,包括数据类型、非空值数量和内存使用情况。describe(): 为数值型列生成描述性统计信息(计数、均值、标准差、最小值、最大值、四分位数等)。shape: 返回一个元组,表示 DataFrame 的维度(行数, 列数)。dtypes: 显示每列的数据类型。
python
print("前 3 行:\n", df.head(3))
print("\nDataFrame 信息:")
df.info()
print("\n描述性统计:\n", df.describe())
选择与索引
访问 DataFrame 的特定部分对于数据分析至关重要。
选择列
您可以使用列名选择单列或多列。
“`python
选择单列(返回 Series)
names = df[‘Name’]
print(“\n姓名 (Series):\n”, names)
选择多列(返回 DataFrame)
name_age = df[[‘Name’, ‘Age’]]
print(“\n姓名和年龄 (DataFrame):\n”, name_age)
“`
使用 loc 和 iloc 选择行
loc: 基于标签的索引。用于通过标签(索引名和列名)选择行和列。iloc: 基于整数位置的索引。用于通过整数位置选择行和列。
“`python
使用 loc 按标签(索引 0)选择行
row_0_loc = df.loc[0]
print(“\n第 0 行 (loc):\n”, row_0_loc)
使用 iloc 按整数位置(索引 1)选择行
row_1_iloc = df.iloc[1]
print(“\n第 1 行 (iloc):\n”, row_1_iloc)
使用 loc 选择特定行和列
subset_loc = df.loc[0:2, [‘Name’, ‘City’]]
print(“\n子集 (loc – 行 0-2, Name, City):\n”, subset_loc)
使用 iloc 选择特定行和列 (行 0-1, 列 0 和 2)
subset_iloc = df.iloc[0:2, [0, 2]]
print(“\n子集 (iloc – 行 0-1, 列 0, 2):\n”, subset_iloc)
“`
条件选择(筛选)
您可以根据条件筛选 DataFrame。
“`python
选择年龄大于 28 的行
older_than_28 = df[df[‘Age’] > 28]
print(“\n年龄大于 28 的人:\n”, older_than_28)
选择城市为 ‘New York’ 且年龄为 25 的行
ny_25_year_olds = df[(df[‘City’] == ‘New York’) & (df[‘Age’] == 25)]
print(“\n纽约 25 岁的人:\n”, ny_25_year_olds)
“`
处理缺失数据
在实际数据集中,缺失数据很常见。Pandas 提供了识别和管理缺失数据的工具。
isnull(): 返回一个布尔型 DataFrame,指示数据是否缺失(True 表示缺失)。dropna(): 删除包含缺失值的行或列。fillna(): 使用指定值或方法(如均值、中位数、前向填充)填充缺失值。
“`python
import numpy as np
创建一个包含缺失值的 DataFrame
data_missing = {
‘Name’: [‘Alice’, ‘Bob’, np.nan, ‘David’, ‘Eve’],
‘Age’: [25, 30, np.nan, 28, 40],
‘City’: [‘New York’, ‘Los Angeles’, ‘Chicago’, np.nan, ‘Boston’]
}
df_missing = pd.DataFrame(data_missing)
print(“\n包含缺失值的 DataFrame:\n”, df_missing)
检查缺失值
print(“\n缺失值 (isnull):\n”, df_missing.isnull())
print(“\n每列的总缺失值:\n”, df_missing.isnull().sum())
删除包含任何缺失值的行
df_dropped_rows = df_missing.dropna()
print(“\n删除缺失值行后的 DataFrame:\n”, df_dropped_rows)
用平均年龄填充缺失的 ‘Age’
mean_age = df_missing[‘Age’].mean()
df_filled_age = df_missing.fillna({‘Age’: mean_age})
print(“\n用平均值填充缺失 Age 后的 DataFrame:\n”, df_filled_age)
“`
数据清洗与操作
重命名列
python
df_renamed = df.rename(columns={'Name': 'Full_Name', 'City': 'Location'})
print("\n重命名列后的 DataFrame:\n", df_renamed)
删除列或行
“`python
删除一列
df_no_city = df.drop(columns=[‘City’])
print(“\n删除 ‘City’ 列后的 DataFrame:\n”, df_no_city)
按索引删除一行
df_no_row_1 = df.drop(index=1)
print(“\n删除索引为 1 的行后的 DataFrame:\n”, df_no_row_1)
“`
排序数据
您可以根据一列或多列的值对 DataFrame 进行排序。
“`python
df_sorted_age = df.sort_values(by=’Age’, ascending=True)
print(“\n按年龄升序排列的 DataFrame:\n”, df_sorted_age)
df_sorted_city_age = df.sort_values(by=[‘City’, ‘Age’], ascending=[True, False])
print(“\n按城市升序再按年龄降序排列的 DataFrame:\n”, df_sorted_city_age)
“`
基本操作
分组 (groupby())
groupby() 方法用于根据某些列对行进行分组,然后执行聚合操作。
“`python
data_sales = {
‘Product’: [‘A’, ‘B’, ‘A’, ‘C’, ‘B’, ‘A’],
‘Region’: [‘East’, ‘West’, ‘East’, ‘North’, ‘West’, ‘South’],
‘Sales’: [100, 150, 120, 80, 200, 90]
}
df_sales = pd.DataFrame(data_sales)
print(“\n销售 DataFrame:\n”, df_sales)
按 ‘Product’ 分组并计算 ‘Sales’ 的总和
product_sales = df_sales.groupby(‘Product’)[‘Sales’].sum()
print(“\n按产品分类的总销售额:\n”, product_sales)
按 ‘Region’ 分组并计算 ‘Sales’ 的平均值
region_avg_sales = df_sales.groupby(‘Region’)[‘Sales’].mean()
print(“\n按地区分类的平均销售额:\n”, region_avg_sales)
“`
应用函数 (apply())
apply() 方法可用于沿 DataFrame 或 Series 的轴应用函数。
“`python
对一列应用 lambda 函数
df[‘Age_in_Years’] = df[‘Age’].apply(lambda x: f”{x} years”)
print(“\n包含 ‘Age_in_Years’ 列的 DataFrame:\n”, df)
对多列应用自定义函数
def categorize_age(age):
if age < 30:
return ‘Young’
elif age < 40:
return ‘Adult’
else:
return ‘Senior’
df[‘Age_Category’] = df[‘Age’].apply(categorize_age)
print(“\n包含 ‘Age_Category’ 列的 DataFrame:\n”, df)
“`
通过掌握这些核心概念和实用操作,您将能够利用 Pandas 有效地处理和分析数据。