第一章:Pandas 基础


文档摘要

第一章:Pandas 基础 第一章:Pandas 基础 Pandas 是 Python 中用于数据分析和处理的强大库。它提供了高性能、易于使用的数据结构,例如 Series 和 DataFrame,使得数据清洗、转换、分析和可视化变得更加简单。 本章将深入探讨 Pandas 的基础知识,包括 Series 和 DataFrame 的创建、数据访问、基本操作以及数据导入导出。 1.1 Pandas 简介 Pandas 建立在 NumPy 之上,并提供了更高级的数据结构和数据分析工具。 它的核心功能包括: 数据结构: Series(一维数据)和 DataFrame(二维表格数据)。 数据对齐: 自动或显式地对齐不同数据结构的数据。 缺失数据处理: 灵活处理缺失数据(NaN)。

第一章:Pandas 基础

第一章:Pandas 基础

Pandas 是 Python 中用于数据分析和处理的强大库。它提供了高性能、易于使用的数据结构,例如 Series 和 DataFrame,使得数据清洗、转换、分析和可视化变得更加简单。 本章将深入探讨 Pandas 的基础知识,包括 Series 和 DataFrame 的创建、数据访问、基本操作以及数据导入导出。

1.1 Pandas 简介

Pandas 建立在 NumPy 之上,并提供了更高级的数据结构和数据分析工具。 它的核心功能包括:

  • 数据结构: Series(一维数据)和 DataFrame(二维表格数据)。

  • 数据对齐: 自动或显式地对齐不同数据结构的数据。

  • 缺失数据处理: 灵活处理缺失数据(NaN)。

  • 数据转换: 方便的数据切片、索引、子集选择。

  • 数据合并与连接: 强大的数据合并和连接操作。

  • 时间序列功能: 专门的时间序列处理工具。

  • 数据导入导出: 支持多种数据格式(CSV、Excel、SQL、JSON 等)。

1.2 Series

Series 是一种一维带标签的数组,可以存储任何数据类型(整数、浮点数、字符串、Python 对象等)。 标签被称为索引。

1.2.1 创建 Series

import pandas as pd # 从列表创建 Series data = [10, 20, 30, 40, 50] s = pd.Series(data) print(s) # 从 NumPy 数组创建 Series import numpy as np data = np.array([1, 2, 3, 4, 5]) s = pd.Series(data) print(s) # 从字典创建 Series data = {'a': 1, 'b': 2, 'c': 3} s = pd.Series(data) print(s) # 指定索引 s = pd.Series(data, index=['c', 'a', 'b']) # 索引顺序可以自定义 print(s)

代码详解:

  • pd.Series(data):使用列表、NumPy 数组或字典创建 Series。

  • index 参数:允许指定 Series 的索引。如果从字典创建 Series 且指定了 index,则只有 index 中存在的键值对会被包含在 Series 中。

1.2.2 访问 Series 数据

s = pd.Series([10, 20, 30, 40, 50], index=['a', 'b', 'c', 'd', 'e']) # 通过索引标签访问 print(s['a']) # 通过位置索引访问 print(s[0]) # 切片 print(s[1:3]) # 包括索引 1,不包括索引 3 print(s['b':'d']) # 包括 'b' 和 'd' # 布尔索引 print(s[s > 30])

代码详解:

  • s['a']:通过索引标签访问 Series 中的元素。

  • s[0]:通过位置索引访问 Series 中的元素(类似于列表)。

  • s[1:3]:切片操作,返回 Series 的一个子集。

  • s[s > 30]:布尔索引,返回 Series 中满足条件的元素。

1.2.3 Series 的属性和方法

s = pd.Series([10, 20, 30, 40, 50], index=['a', 'b', 'c', 'd', 'e']) # 属性 print(s.index) # 获取索引 print(s.values) # 获取值 print(s.dtype) # 获取数据类型 # 方法 print(s.head(2)) # 返回前 n 行,默认为 5 print(s.tail(2)) # 返回后 n 行,默认为 5 print(s.describe()) # 返回描述性统计信息 print(s.mean()) # 计算平均值 print(s.max()) # 计算最大值

代码详解:

  • .index:返回 Series 的索引对象。

  • .values:返回 Series 的值(NumPy 数组)。

  • .dtype:返回 Series 的数据类型。

  • .head(n):返回 Series 的前 n 行。

  • .tail(n):返回 Series 的后 n 行。

  • .describe():返回 Series 的描述性统计信息,包括计数、均值、标准差、最小值、最大值以及四分位数。

1.3 DataFrame

DataFrame 是 Pandas 中最重要的的数据结构,它是一个二维表格,由行和列组成。 可以将 DataFrame 视为 Series 的集合,其中每一列都是一个 Series,且所有 Series 共享同一个索引。

1.3.1 创建 DataFrame

import pandas as pd # 从字典创建 DataFrame data = {'name': ['Alice', 'Bob', 'Charlie'], 'age': [25, 30, 28], 'city': ['New York', 'London', 'Paris']} df = pd.DataFrame(data) print(df) # 从列表的字典创建 DataFrame data = [{'name': 'Alice', 'age': 25, 'city': 'New York'}, {'name': 'Bob', 'age': 30, 'city': 'London'}, {'name': 'Charlie', 'age': 28, 'city': 'Paris'}] df = pd.DataFrame(data) print(df) # 从 NumPy 数组创建 DataFrame import numpy as np data = np.array([['Alice', 25, 'New York'], ['Bob', 30, 'London'], ['Charlie', 28, 'Paris']]) df = pd.DataFrame(data, columns=['name', 'age', 'city']) print(df)

代码详解:

  • pd.DataFrame(data):使用字典、列表的字典或 NumPy 数组创建 DataFrame。

  • columns 参数:用于指定 DataFrame 的列名。

1.3.2 访问 DataFrame 数据

data = {'name': ['Alice', 'Bob', 'Charlie'], 'age': [25, 30, 28], 'city': ['New York', 'London', 'Paris']} df = pd.DataFrame(data) # 访问列 print(df['name']) # 返回一个 Series print(df[['name', 'age']]) # 返回一个新的 DataFrame # 访问行 print(df.loc[0]) # 通过标签访问,返回一个 Series print(df.iloc[0]) # 通过位置访问,返回一个 Series # 切片 print(df[0:2]) # 切片行 print(df.loc[0:1, ['name', 'age']]) # 切片行和列(使用标签) print(df.iloc[0:2, 0:2]) # 切片行和列(使用位置) # 布尔索引 print(df[df['age'] > 28])

代码详解:

  • df['name']:访问名为 'name' 的列,返回一个 Series。

  • df[['name', 'age']]:访问 'name' 和 'age' 列,返回一个新的 DataFrame。

  • df.loc[0]:通过索引标签访问行。

  • df.iloc[0]:通过位置索引访问行。

  • df[0:2]:切片行。

  • df.loc[0:1, ['name', 'age']]:使用标签切片行和列。

  • df.iloc[0:2, 0:2]:使用位置切片行和列。

  • df[df['age'] > 28]:使用布尔索引筛选行。

1.3.3 DataFrame 的属性和方法

data = {'name': ['Alice', 'Bob', 'Charlie'], 'age': [25, 30, 28], 'city': ['New York', 'London', 'Paris']} df = pd.DataFrame(data) # 属性 print(df.index) # 获取索引 print(df.columns) # 获取列名 print(df.values) # 获取值 print(df.dtypes) # 获取数据类型 print(df.shape) # 获取形状(行数,列数) # 方法 print(df.head(2)) # 返回前 n 行,默认为 5 print(df.tail(2)) # 返回后 n 行,默认为 5 print(df.describe()) # 返回描述性统计信息 print(df.info()) # 返回 DataFrame 的信息,包括索引、数据类型、非空值数量等 print(df.sort_values(by='age')) # 按 'age' 列排序

代码详解:

  • .index:返回 DataFrame 的索引对象。

  • .columns:返回 DataFrame 的列名。

  • .values:返回 DataFrame 的值(NumPy 数组)。

  • .dtypes:返回 DataFrame 的数据类型。

  • .shape:返回 DataFrame 的形状(行数,列数)。

  • .head(n):返回 DataFrame 的前 n 行。

  • .tail(n):返回 DataFrame 的后 n 行。

  • .describe():返回 DataFrame 的描述性统计信息。

  • .info():返回 DataFrame 的信息,包括索引、数据类型、非空值数量等。

  • .sort_values(by='age'):按 'age' 列排序。

1.4 数据导入与导出

Pandas 提供了多种方法来导入和导出数据,常见的格式包括 CSV、Excel、SQL、JSON 等。

1.4.1 CSV 文件

import pandas as pd # 读取 CSV 文件 df = pd.read_csv('data.csv') print(df.head()) # 写入 CSV 文件 df.to_csv('output.csv', index=False) # index=False 防止写入索引列

1.4.2 Excel 文件

import pandas as pd # 读取 Excel 文件 df = pd.read_excel('data.xlsx', sheet_name='Sheet1') print(df.head()) # 写入 Excel 文件 df.to_excel('output.xlsx', sheet_name='Sheet1', index=False)

1.4.3 其他格式

Pandas 还支持读取和写入其他格式的数据,例如 JSON、SQL 数据库等。 请参考 Pandas 文档以获取更多信息。

1.5 缺失数据处理

Pandas 使用 NaN(Not a Number)表示缺失数据。 Pandas 提供了多种方法来处理缺失数据。

import pandas as pd import numpy as np data = {'name': ['Alice', 'Bob', 'Charlie', 'David'], 'age': [25, np.nan, 28, 32], 'city': ['New York', 'London', np.nan, 'Paris']} df = pd.DataFrame(data) # 检查缺失值 print(df.isnull()) #返回布尔值,缺失值为True print(df.notnull()) #返回布尔值,非缺失值为True print(df.isnull().sum()) #统计每列缺失值的数量 # 填充缺失值 df_filled = df.fillna(0) # 使用 0 填充 print(df_filled) df_filled_mean = df.fillna(df['age'].mean()) # 使用均值填充 print(df_filled_mean) # 删除包含缺失值的行 df_dropna = df.dropna() print(df_dropna) # 删除包含缺失值的列 df_dropna_col = df.dropna(axis=1) print(df_dropna_col)

代码详解:

  • df.isnull():检查 DataFrame 中是否存在缺失值,返回一个布尔型 DataFrame。

  • df.fillna(value):使用指定的值填充缺失值。

  • df.dropna():删除包含缺失值的行。

  • df.dropna(axis=1):删除包含缺失值的列。

1.6 基本数据操作

Pandas 提供了丰富的操作来处理 DataFrame 中的数据。

import pandas as pd data = {'name': ['Alice', 'Bob', 'Charlie'], 'age': [25, 30, 28], 'city': ['New York', 'London', 'Paris']} df = pd.DataFrame(data) # 添加新列 df['salary'] = [50000, 60000, 55000] print(df) # 删除列 df = df.drop('city', axis=1) print(df) # 修改列名 df = df.rename(columns={'name': 'full_name'}) print(df) # 应用函数 def increment_age(age): return age + 1 df['age'] = df['age'].apply(increment_age) print(df)

代码详解:

  • df['salary'] = ...:添加名为 'salary' 的新列。

  • df.drop('city', axis=1):删除名为 'city' 的列。

  • df.rename(columns={'name': 'full_name'}):将 'name' 列重命名为 'full_name'。

  • df['age'].apply(increment_age):将 increment_age 函数应用于 'age' 列的每个元素。

1.7 数据排序

Pandas 提供了多种方法来对 DataFrame 进行排序。

import pandas as pd data = {'name': ['Alice', 'Bob', 'Charlie'], 'age': [25, 30, 28], 'city': ['New York', 'London', 'Paris']} df = pd.DataFrame(data) # 按单列排序 df_sorted_age = df.sort_values(by='age') print(df_sorted_age) # 按多列排序 df_sorted_multi = df.sort_values(by=['city', 'age']) print(df_sorted_multi) # 降序排序 df_sorted_desc = df.sort_values(by='age', ascending=False) print(df_sorted_desc)

代码详解:

  • df.sort_values(by='age'):按 'age' 列升序排序。

  • df.sort_values(by=['city', 'age']):先按 'city' 列排序,再按 'age' 列排序。

  • ascending=False:降序排序。

1.8 数据分组与聚合

Pandas 提供了强大的分组和聚合功能,可以对数据进行分组并计算统计信息。

import pandas as pd data = {'city': ['New York', 'New York', 'London', 'London', 'Paris', 'Paris'], 'gender': ['Male', 'Female', 'Male', 'Female', 'Male', 'Female'], 'age': [25, 30, 28, 32, 35, 27], 'salary': [50000, 60000, 55000, 65000, 70000, 52000]} df = pd.DataFrame(data) # 按城市分组并计算平均年龄 grouped_age = df.groupby('city')['age'].mean() print(grouped_age) # 按城市和性别分组并计算平均工资 grouped_salary = df.groupby(['city', 'gender'])['salary'].mean() print(grouped_salary) # 使用多个聚合函数 grouped_agg = df.groupby('city').agg({'age': 'mean', 'salary': 'sum'}) print(grouped_agg)

代码详解:

  • df.groupby('city')['age'].mean():按 'city' 列分组,然后计算每个城市的 'age' 列的平均值。

  • df.groupby(['city', 'gender'])['salary'].mean():按 'city' 和 'gender' 列分组,然后计算每个城市和性别的 'salary' 列的平均值。

  • df.groupby('city').agg({'age': 'mean', 'salary': 'sum'}):按 'city' 列分组,然后计算每个城市的 'age' 列的平均值和 'salary' 列的总和。

1.9 数据合并与连接

Pandas 提供了多种方法来合并和连接 DataFrame。

import pandas as pd # 创建两个 DataFrame df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'], 'value1': [1, 2, 3, 4]}) df2 = pd.DataFrame({'key': ['B', 'D', 'E', 'F'], 'value2': [5, 6, 7, 8]}) # 合并 DataFrame (inner join) df_merged = pd.merge(df1, df2, on='key', how='inner') print(df_merged) # 连接 DataFrame (left join) df_joined = pd.merge(df1, df2, on='key', how='left') print(df_joined) # 连接 DataFrame (right join) df_joined_right = pd.merge(df1, df2, on='key', how='right') print(df_joined_right) # 连接 DataFrame (outer join) df_joined_outer = pd.merge(df1, df2, on='key', how='outer') print(df_joined_outer) # 拼接 DataFrame (concat) df_concat = pd.concat([df1, df2], ignore_index=True) # ignore_index=True 重置索引 print(df_concat)

代码详解:

  • pd.merge(df1, df2, on='key', how='inner'):使用 'key' 列作为连接键,执行内连接。

  • pd.merge(df1, df2, on='key', how='left'):使用 'key' 列作为连接键,执行左连接。

  • pd.merge(df1, df2, on='key', how='right'):使用 'key' 列作为连接键,执行右连接。

  • pd.merge(df1, df2, on='key', how='outer'):使用 'key' 列作为连接键,执行外连接。

  • pd.concat([df1, df2], ignore_index=True):将 df1 和 df2 沿行方向拼接,忽略原始索引并创建新的索引。

1.10 总结

本章介绍了 Pandas 的基础知识,包括 Series 和 DataFrame 的创建、数据访问、基本操作、数据导入导出、缺失数据处理、数据排序、数据分组与聚合以及数据合并与连接。 掌握这些基础知识对于使用 Pandas 进行数据分析至关重要。在接下来的章节中,我们将学习更高级的 Pandas 功能,例如时间序列分析和数据可视化。

1.11 Mermaid 图

以下是一个 Mermaid 图,展示了 DataFrame 的基本结构:

图示说明:

  • DataFrame:表示 DataFrame 对象。

  • Index:表示 DataFrame 的索引,包含行标签。

  • Columns:表示 DataFrame 的列,包含列名。

  • Data:表示 DataFrame 的数据,包含实际的值。

  • Row Labels:行标签。

  • Column Names:列名。

  • Values:实际的数据值。

这个图可以帮助你更好地理解 DataFrame 的组成部分以及它们之间的关系。


发布者: 作者: 转发
评论区 (0)
U