Pandas 是 Python 里最常用的数据分析工具库之一,适合做数据清洗、数据统计、表格处理等工作。
文章记录的只是 部分基础和常用命令,如需深入学习了解,可以移步pandas 官方文档
目录
1. Pandas 简介
- pandas 是基于 NumPy 的数据分析库。
- pands的英文全称pannel data(面板数据)
- 核心数据结构:
- Series:一维数据,类似一列。
- DataFrame:二维表格,类似 Excel。
- 常用于:
- 读写数据(csv、excel、sql、json等)。
- 数据清洗(缺失值、重复值、数据替换)。
- 数据筛选与过滤。
- 分组统计与聚合。
- 时间序列分析。
- 特别适合处理结构化数据,如表格类型的数据(类似Excel的表格,关系型数据库SQL)
2. 核心数据结构
2.1 Series
2.1.1 Series的创建
如图左侧为Series Index,代表索引
A为Series Name,代表名字
下边空行为Series Values,代表代表值
一维带标签的数组,可以看成是 索引 + 值。
import pandas as pd
# 创建 Series
s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
print(s)
输出:
a 10
b 20
c 30
dtype: int64
另外还有两种创建方式:
import pandas as pd
# 创建 Series,同时指定索引和名字
s = pd.Series([10, 20, 30], index=['a', 'b', 'c'], name="鸣潮_Series")
# 通过字典创建 Series
s2 = pd.Series({'无妄者': 60, '鉴心': 70, '吟霖': 80}, name="鸣潮角色等级")
常用操作:
s.values
取值数组s.index
索引s['a']
按标签取值s[0]
按位置取值
2.1.2 Series的常用属性
import pandas as pd
# 创建一个 Series
s = pd.Series([10, 20, 30, 40, 50], index=["a", "b", "c", "d", "e"], name="scores")
print("索引:", s.index)
print("值:", s.values)
print("数据类型:", s.dtype)
print("形状:", s.shape)
print("大小:", s.size)
print("维度:", s.ndim)
print("名称:", s.name)
print("是否唯一:", s.is_unique)
print("是否有缺失值:", s.hasnans)
print("内存占用:", s.memory_usage())
输出
索引: Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
值: [10 20 30 40 50]
数据类型: int64
形状: (5,)
大小: 5
维度: 1
名称: scores
是否唯一: True
是否有缺失值: False
内存占用: 148
2.1.3 Series的常用函数方法
import pandas as pd
s = pd.Series([10, 20, 20, None, 40, 50, 50, 50], name="scores")
print("唯一值:", s.unique())
print("唯一值数量:", s.nunique())
print("值频率:\n", s.value_counts())
print("平均值:", s.mean())
print("描述统计:\n", s.describe())
print("是否缺失:\n", s.isnull())
print("填充缺失:\n", s.fillna(0))
print("去重:\n", s.drop_duplicates())
print("排序:\n", s.sort_values(ascending=False))
输出
唯一值: [10. 20. nan 40. 50.]
唯一值数量: 4
值频率:
50.0 3
20.0 2
10.0 1
40.0 1
Name: scores, dtype: int64
平均值: 31.666666666666668
描述统计:
count 7.000000
mean 32.857143
std 15.198684
min 10.000000
25% 20.000000
50% 40.000000
75% 50.000000
max 50.000000
Name: scores, dtype: float64
是否缺失:
0 False
1 False
2 False
3 True
4 False
5 False
6 False
7 False
Name: scores, dtype: bool
填充缺失:
0 10.0
1 20.0
2 20.0
3 0.0
4 40.0
5 50.0
6 50.0
7 50.0
Name: scores, dtype: float64
去重:
0 10.0
1 20.0
3 NaN
4 40.0
5 50.0
Name: scores, dtype: float64
排序:
5 50.0
6 50.0
7 50.0
4 40.0
1 20.0
2 20.0
0 10.0
3 NaN
Name: scores, dtype: float64
2.1.4 Series的布尔索引
import pandas as pd
s = pd.Series([10, 20, 30, 40, 50], index=['a', 'b', 'c', 'd', 'e'])
print("原始数据:\n", s)
# 筛选大于30的元素
print("\n大于30:\n", s[s > 30])
# 筛选等于20的元素
print("\n等于20:\n", s[s == 20])
# 筛选不等于10的元素
print("\n不等于10:\n", s[s != 10])
输出
原始数据:
a 10
b 20
c 30
d 40
e 50
dtype: int64
大于30:
d 40
e 50
dtype: int64
等于20:
b 20
dtype: int64
不等于10:
b 20
c 30
d 40
e 50
dtype: int64
多个条件要用 &
(与)、|
(或)、~
(非),注意要加括号:
# 大于20 且 小于50
print("\n20 < x < 50:\n", s[(s > 20) & (s < 50)])
# 等于10 或 等于50
print("\n等于10或50:\n", s[(s == 10) | (s == 50)])
# 非大于30
print("\n不是大于30:\n", s[~(s > 30)])
2.1.5 Series的运算
运算类别 | 示例 | 说明 | 示例结果 |
算术运算 |
| 每个元素加 5 |
|
| 每个元素减 2 |
| |
| 每个元素乘 2 |
| |
| 每个元素除以 10 |
| |
| 每个元素平方 |
| |
两个 Series 运算 |
| 按索引自动对齐,缺失补 NaN |
|
统计运算 |
| 求和 |
|
| 平均值 |
| |
| 最大值 |
| |
| 最小值 |
| |
| 标准差 |
| |
逻辑运算 |
| 大于 20 的元素标记为 True |
|
| 判断是否等于 30 |
| |
| 判断是否不等于 40 |
| |
Numpy 函数运算 |
| 逐元素开方 |
|
| 指数运算 |
| |
| 正弦运算 |
|
2.2 DataFrame
2.2.1 DataFrame的创建
DataFrame是 Pandas 中最常用的数据结构,类似于 Excel 表格 或 数据库中的数据表。
其中:
- 行(row):用索引(Index)标记。
- 列(column):用列名(Column Labels)标记。
- 数据(data):本质上存放在 Numpy 数组中,运算效率高。
可以理解为:
Series = 一维数组(带索引)
DataFrame = 多个 Series 的集合(共享一个行索引)。
二维表格,带行索引和列索引。
data = {
'name': ['Tom', 'Jerry', 'Spike'],
'age': [20, 21, 19],
'score': [90, 85, 88]
}
df = pd.DataFrame(data)
print(df)
输出:
name age score
0 Tom 20 90
1 Jerry 21 85
2 Spike 19 88
常用属性:
df.shape
行列数df.columns
列名df.index
行索引df.values
转为数组
2.2.2 DataFrame的基本属性
属性 | 说明 | 示例 |
| 返回 DataFrame 的行数和列数(元组) |
|
| 行索引对象(Index) |
|
| 列索引对象(Index) |
|
| 各列数据类型 |
|
| 数据的 Numpy 数组表示 |
|
| 维度(一般为 2) |
|
| 元素总数(行数 × 列数) |
|
| 是否为空 |
|
| 转置(行列交换) | 见下方示例 |
| 行索引和列索引列表 |
|
示例:
import pandas as pd
# 创建 DataFrame
data = {
"Name": ["Alice", "Bob", "Charlie"],
"Age": [25, 30, 35],
"Score": [90, 85, 88]
}
df = pd.DataFrame(data)
print("数据表:\n", df, "\n")
print("形状 shape:", df.shape)
print("行索引 index:", df.index)
print("列索引 columns:", df.columns)
print("数据类型 dtypes:\n", df.dtypes)
print("Numpy 数组 values:\n", df.values)
print("维度 ndim:", df.ndim)
print("元素总数 size:", df.size)
print("是否为空 empty:", df.empty)
print("转置 T:\n", df.T)
print("axes (行索引和列索引):\n", df.axes)
输出:
数据表:
Name Age Score
0 Alice 25 90
1 Bob 30 85
2 Charlie 35 88
形状 shape: (3, 3)
行索引 index: RangeIndex(start=0, stop=3, step=1)
列索引 columns: Index(['Name', 'Age', 'Score'], dtype='object')
数据类型 dtypes:
Name object
Age int64
Score int64
dtype: object
Numpy 数组 values:
[['Alice' 25 90]
['Bob' 30 85]
['Charlie' 35 88]]
维度 ndim: 2
元素总数 size: 9
是否为空 empty: False
转置 T:
0 1 2
Name Alice Bob Charlie
Age 25 30 35
Score 90 85 88
axes (行索引和列索引):
[RangeIndex(start=0, stop=3, step=1), Index(['Name', 'Age', 'Score'], dtype='object')]
2.2.3 Dataframe的常用函数方法
数据查看方法:
方法 | 说明 | 示例 |
| 查看前 n 行(默认 5) |
|
| 查看后 n 行 |
|
| 查看基本信息(行数、列数、类型、内存) |
|
| 数值列的统计摘要(均值、方差、分位数) |
|
| 随机抽样 |
|
索引选择方法:
方法 | 说明 | 示例 |
| 选择某一列(返回 Series) |
|
| 选择多列(返回 DataFrame) |
|
| 按标签选择 |
|
| 按位置选择 |
|
| 快速获取单个值(标签) |
|
| 快速获取单个值(位置) |
|
数据清洗方法:
方法 | 说明 | 示例 |
| 删除行或列 |
|
| 重命名行或列 |
|
| 填充缺失值 |
|
| 删除缺失值 |
|
| 替换值 |
|
| 检测重复行 |
|
| 删除重复行 |
|
统计分析方法:
方法 | 说明 | 示例 |
| 按列求和 |
|
| 平均值 |
|
| 中位数 |
|
| 标准差 |
|
| 最小值/最大值 |
|
| 统计某列值的频数 |
|
| 各列相关系数矩阵 |
|
| 按某列分组聚合 |
|
| 透视表 |
|
示例
import pandas as pd
data = {
"Name": ["Alice", "Bob", "Charlie", "Alice"],
"Age": [25, 30, 35, 25],
"Score": [90, 85, 88, None]
}
df = pd.DataFrame(data)
print("前两行:\n", df.head(2))
print("信息:\n"); df.info()
print("描述:\n", df.describe())
# 索引选择
print("选择列 Name:\n", df['Name'])
print("iloc 选择:\n", df.iloc[0, 1])
# 数据清洗
print("填充缺失值:\n", df.fillna(0))
print("去重:\n", df.drop_duplicates())
# 统计分析
print("平均分:", df['Score'].mean())
print("按 Age 分组平均分:\n", df.groupby('Age')['Score'].mean())
输出
前两行:
Name Age Score
0 Alice 25 90.0
1 Bob 30 85.0
信息:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Name 4 non-null object
1 Age 4 non-null int64
2 Score 3 non-null float64
dtypes: float64(1), int64(1), object(1)
memory usage: 228.0+ bytes
描述:
Age Score
count 4.000000 3.000000
mean 28.750000 87.666667
std 4.787136 2.516611
min 25.000000 85.000000
25% 25.000000 86.500000
50% 27.500000 88.000000
75% 31.250000 89.000000
max 35.000000 90.000000
选择列 Name:
0 Alice
1 Bob
2 Charlie
3 Alice
Name: Name, dtype: object
iloc 选择:
25
填充缺失值:
Name Age Score
0 Alice 25 90.0
1 Bob 30 85.0
2 Charlie 35 88.0
3 Alice 25 0.0
去重:
Name Age Score
0 Alice 25 90.0
1 Bob 30 85.0
2 Charlie 35 88.0
3 Alice 25 NaN
平均分: 87.66666666666667
按 Age 分组平均分:
Age
25 90.0
30 85.0
35 88.0
Name: Score, dtype: float64
3. 数据读取与保存
- 读取数据
pd.read_csv('data.csv') # 读取 CSV
pd.read_excel('data.xlsx') # 读取 Excel
pd.read_json('data.json') # 读取 JSON
- 保存数据
df.to_csv('out.csv', index=False)
df.to_excel('out.xlsx', index=False)
4. 基础操作
4.1 数据选取
df['age'] # 取一列
df[['name','age']] # 取多列
df.loc[0] # 按行标签
df.iloc[0] # 按行位置
4.2 条件筛选
df[df['age'] > 20]
df[(df['age'] > 20) & (df['score'] > 85)]
4.3 排序
df.sort_values('score', ascending=False)
4.4 去重
df.drop_duplicates(subset=['name'])
5. 缺失值处理
df.dropna() # 删除缺失值
df.fillna(0) # 填充缺失值
df['age'].fillna(df['age'].mean()) # 用平均值填充
6. 常见统计函数
df.describe()
快速统计df.mean()
平均值df.sum()
求和df.min()
/df.max()
df.count()
非空数量df.value_counts()
计数
7. 分组与聚合
df.groupby('age')['score'].mean() # 按年龄分组求平均
df.groupby('age').agg({'score':'max','age':'count'})
8. 时间序列处理
dates = pd.date_range('2025-01-01', periods=6, freq='D')
ts = pd.Series([1,2,3,4,5,6], index=dates)
print(ts['2025-01-03':'2025-01-05'])
9. 进阶操作
- 合并与连接
pd.concat([df1, df2]) # 行拼接
pd.merge(df1, df2, on='key') # 按某列合并
- 透视表
df.pivot_table(values='score', index='age', aggfunc='mean')