Pandas Series与DataFrame API及属性详解
Pandas 是 Python 中用于数据分析的强大库,其核心数据结构为 Series(一维数据)和 DataFrame(二维数据)。本文将详细介绍 Series 和 DataFrame 的常用 API、属性,并通过示例帮助理解和记忆。
一、Pandas Series 详解
1. Series 简介
Series 是一个带标签的一维数组,类似于 NumPy 数组与 Python 字典的结合体。它由两部分组成:
- 数据:存储实际值(可以是任何类型)。
- 索引:每个数据的标签,默认从 0 开始。
2. Series 创建
以下是创建 Series 的常用方法:
import pandas as pd
import numpy as np
# 通过列表创建
s1 = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
print(s1)
# 输出:
# a 1
# b 2
# c 3
# d 4
# dtype: int64
# 通过字典创建
s2 = pd.Series({'x': 10, 'y': 20, 'z': 30})
print(s2)
# 输出:
# x 10
# y 20
# z 30
# dtype: int64
# 通过 NumPy 数组创建
s3 = pd.Series(np.array([5, 6, 7]), index=['p', 'q', 'r'])
print(s3)
# 输出:
# p 5
# q 6
# r 7
# dtype: int64
3. Series 属性
以下是 Series 的常用属性,用于快速获取信息:
| 属性 | 描述 | 示例代码 | 输出 |
|---|---|---|---|
values | 返回底层 NumPy 数组 | s1.values | [1 2 3 4] |
index | 返回索引对象 | s1.index | Index(['a', 'b', 'c', 'd'], dtype='object') |
dtype | 返回数据类型 | s1.dtype | int64 |
name | 返回 Series 的名称 | s1.name = 'test'; print(s1.name) | test |
size | 返回元素个数 | s1.size | 4 |
empty | 检查是否为空 | pd.Series().empty | True |
示例:
s = pd.Series([10, 20, 30], index=['x', 'y', 'z'], name='scores')
print(s.values) # [10 20 30]
print(s.index) # Index(['x', 'y', 'z'], dtype='object')
print(s.dtype) # int64
print(s.name) # scores
print(s.size) # 3
4. Series 常用 API
以下是 Series 的常用方法,分为索引、运算、统计和数据处理等类别:
(1)索引与选择
| 方法 | 描述 | 示例代码 | 输出 |
|---|---|---|---|
loc[] | 基于标签索引 | s.loc['x'] | 10 |
iloc[] | 基于位置索引 | s.iloc[0] | 10 |
at[] | 快速标量访问(标签) | s.at['y'] | 20 |
iat[] | 快速标量访问(位置) | s.iat[1] | 20 |
示例:
s = pd.Series([10, 20, 30], index=['x', 'y', 'z'])
print(s.loc['x']) # 10
print(s.iloc[1]) # 20
print(s.at['z']) # 30
print(s.iat[0]) # 10
(2)数学与统计
| 方法 | 描述 | 示例代码 | 输出 |
|---|---|---|---|
sum() | 求和 | s.sum() | 60 |
mean() | 均值 | s.mean() | 20.0 |
std() | 标准差 | s.std() | 10.0 |
min() / max() | 最小/最大值 | s.min() | 10 |
idxmin() / idxmax() | 最小/最大值的索引 | s.idxmax() | 'z' |
示例:
s = pd.Series([10, 20, 30], index=['x', 'y', 'z'])
print(s.sum()) # 60
print(s.mean()) # 20.0
print(s.max()) # 30
print(s.idxmin()) # 'x'
(3)数据处理
| 方法 | 描述 | 示例代码 | 输出 |
|---|---|---|---|
apply() | 应用自定义函数 | s.apply(lambda x: x*2) | x 20, y 40, z 60 |
map() | 映射值 | s.map({10: 'low', 20: 'mid', 30: 'high'}) | x low, y mid, z high |
replace() | 替换值 | s.replace(10, 100) | x 100, y 20, z 30 |
dropna() | 删除缺失值 | pd.Series([1, np.nan, 3]).dropna() | 0 1.0, 2 3.0 |
示例:
s = pd.Series([10, 20, 30], index=['x', 'y', 'z'])
print(s.apply(lambda x: x*2))
# x 20
# y 40
# z 60
print(s.map({10: 'low', 20: 'mid', 30: 'high'}))
# x low
# y mid
# z high
二、Pandas DataFrame 详解
1. DataFrame 简介
DataFrame 是一个带标签的二维数据结构,类似于表格或 SQL 表。它由多个 Series 组成,每列是一个 Series。
2. DataFrame 创建
以下是创建 DataFrame 的常用方法:
# 通过字典创建
data = {'name': ['Alice', 'Bob', 'Cathy'], 'age': [25, 30, 22], 'score': [90, 85, 88]}
df = pd.DataFrame(data)
print(df)
# 输出:
# name age score
# 0 Alice 25 90
# 1 Bob 30 85
# 2 Cathy 22 88
# 通过列表和指定列名
df2 = pd.DataFrame([[1, 'A'], [2, 'B'], [3, 'C']], columns=['id', 'grade'])
print(df2)
# 输出:
# id grade
# 0 1 A
# 1 2 B
# 2 3 C
3. DataFrame 属性
以下是 DataFrame 的常用属性:
| 属性 | 描述 | 示例代码 | 输出 |
|---|---|---|---|
values | 返回底层 NumPy 数组 | df.values | [[Alice 25 90] [Bob 30 85] [Cathy 22 88]] |
index | 返回行索引 | df.index | RangeIndex(start=0, stop=3, step=1) |
columns | 返回列名 | df.columns | Index(['name', 'age', 'score'], dtype='object') |
dtypes | 返回每列数据类型 | df.dtypes | name object, age int64, score int64 |
shape | 返回形状 (行, 列) | df.shape | (3, 3) |
size | 返回元素总数 | df.size | 9 |
示例:
df = pd.DataFrame({'name': ['Alice', 'Bob', 'Cathy'], 'age': [25, 30, 22]})
print(df.columns) # Index(['name', 'age'], dtype='object')
print(df.shape) # (3, 2)
print(df.dtypes) # name object, age int64
4. DataFrame 常用 API
以下是 DataFrame 的常用方法,分为选择、统计、合并和数据处理等类别:
(1)选择与索引
| 方法 | 描述 | 示例代码 | 输出 |
|---|---|---|---|
loc[] | 基于标签索引 | df.loc[0, 'name'] | Alice |
iloc[] | 基于位置索引 | df.iloc[0, 1] | 25 |
at[] | 快速标量访问(标签) | df.at[1, 'age'] | 30 |
iat[] | 快速标量访问(位置) | df.iat[1, 1] | 30 |
head(n) | 查看前 n 行 | df.head(2) | 前两行数据 |
tail(n) | 查看后 n 行 | df.tail(1) | 最后一行数据 |
示例:
df = pd.DataFrame({'name': ['Alice', 'Bob', 'Cathy'], 'age': [25, 30, 22]})
print(df.loc[0, 'name']) # Alice
print(df.iloc[1, 1]) # 30
print(df.head(2))
# name age
# 0 Alice 25
# 1 Bob 30
(2)统计与聚合
| 方法 | 描述 | 示例代码 | 输出 |
|---|---|---|---|
describe() | 统计摘要 | df.describe() | 数值列的统计信息 |
sum() | 按列求和 | df['age'].sum() | 77 |
mean() | 按列均值 | df['age'].mean() | 25.67 |
groupby() | 分组聚合 | df.groupby('name')['age'].mean() | 按 name 分组的 age 均值 |
示例:
df = pd.DataFrame({'name': ['Alice', 'Bob', 'Alice'], 'age': [25, 30, 22]})
print(df.describe())
# age
# count 3.000000
# mean 25.666667
print(df.groupby('name')['age'].mean())
# name
# Alice 23.5
# Bob 30.0
(3)数据处理
| 方法 | 描述 | 示例代码 | 输出 |
|---|---|---|---|
drop() | 删除行/列 | df.drop('age', axis=1) | 删除 age 列 |
fillna() | 填充缺失值 | df.fillna(0) | 缺失值填充为 0 |
merge() | 合并 DataFrame | pd.merge(df1, df2, on='key') | 按 key 合并 |
V sort_values()` | 按列排序 | df.sort_values('age') | 按 age 排序 |
示例:
df = pd.DataFrame({'name': ['Alice', 'Bob', 'Cathy'], 'age': [25, 30, 22]})
df_sorted = df.sort_values('age')
print(df_sorted)
# name age
# 2 Cathy 22
# 0 Alice 25
# 1 Bob 30
三、记忆技巧
-
联想记忆:
- Series:想象成“单一列”(Single column),只有一维数据。
- DataFrame:想象成“数据表格”(Data Frame),多列多行。
-
分类记忆:
- 属性:通常是“只读”信息,如
values,index,shape。 - 方法:通常是“操作”数据,如
loc,apply,groupby。
- 属性:通常是“只读”信息,如
-
实践记忆:
- 动手运行每个示例代码,尤其是
locvsiloc、applyvsmap等易混淆的概念。 - 尝试用真实数据集(如 CSV 文件)练习 DataFrame 操作。
- 动手运行每个示例代码,尤其是
四、总结
Pandas 的 Series 和 DataFrame 提供了丰富的 API 和属性,覆盖数据选择、统计、处理等功能。通过理解其核心概念(索引、标签、数据结构),结合示例代码实践,你可以快速掌握 Pandas 的使用。希望这篇博客能帮助你更轻松地学习和记忆 Pandas!