🐼 Pandas 入门指南
一、Pandas 是什么?
Pandas 是 Python 中最流行的数据分析库,专门用于处理表格数据(类似 Excel)。名字来源于 "Panel Data"(面板数据)。
主要特点:
- 处理表格数据:行和列的结构
- 支持多种数据格式:CSV、Excel、SQL、JSON 等
- 强大的数据操作功能:筛选、分组、聚合、合并
- 缺失值处理:自动识别和处理缺失数据
二、安装 Pandas
pip install pandas
三、两个核心数据结构
1. Series - 一维数组(带标签的列)
import pandas as pd
# 创建 Series
s = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
print(s)
"""
a 10
b 20
c 30
d 40
dtype: int64
"""
# 访问数据
print(s['b']) # 20
print(s[1]) # 20
2. DataFrame - 二维表格(最重要的结构)
# 创建 DataFrame
data = {
'姓名': ['张三', '李四', '王五'],
'年龄': [25, 30, 35],
'城市': ['北京', '上海', '广州']
}
df = pd.DataFrame(data)
print(df)
"""
姓名 年龄 城市
0 张三 25 北京
1 李四 30 上海
2 王五 35 广州
"""
四、数据读取与保存
读取 CSV(你的任务中用到的)
# 读取有表头的 CSV
df = pd.read_csv('data.csv')
# 读取无表头的 CSV(指定列名)
df = pd.read_csv('data.csv', header=None, names=['列1', '列2', '列3'])
# 只读取特定列
df = pd.read_csv('data.csv', usecols=['城市', '温度'])
读取 Excel
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
保存数据
df.to_csv('output.csv', index=False) # 不保存索引列
df.to_excel('output.xlsx')
五、查看和探索数据
df = pd.read_csv('城市通量.csv', header=None, names=['城市', '温度'])
# 1. 查看前几行
print(df.head()) # 默认前5行
print(df.head(3)) # 前3行
# 2. 查看后几行
print(df.tail()) # 默认后5行
# 3. 查看数据形状(行数, 列数)
print(df.shape) # 如:(9, 2)
# 4. 查看列名
print(df.columns) # Index(['城市', '温度'], dtype='object')
# 5. 查看数据类型
print(df.dtypes)
"""
城市 object
温度 int64
dtype: object
"""
# 6. 查看基本信息
print(df.info())
# 7. 查看统计信息
print(df.describe())
"""
温度
count 9.000000
mean 15.777778
std 2.864062
min 12.000000
25% 14.000000
50% 15.000000
75% 18.000000
max 20.000000
"""
六、数据选择与筛选
选择列
# 选择单列(返回 Series)
city_series = df['城市']
temp_series = df.温度 # 也可以用点号
# 选择多列(返回 DataFrame)
df_subset = df[['城市', '温度']]
选择行
# 按位置选择(索引从0开始)
print(df.iloc[0]) # 第1行
print(df.iloc[0:3]) # 第1-3行
# 按标签选择(如果设置了自定义索引)
print(df.loc[0]) # 索引为0的行
条件筛选
# 找出温度大于15的城市
high_temp = df[df['温度'] > 15]
print(high_temp)
# 多条件筛选(用 & 表示且,| 表示或)
result = df[(df['温度'] > 14) & (df['温度'] < 19)]
print(result)
# 找出特定城市
beijing = df[df['城市'] == '北京']
print(beijing)
七、数据处理与转换
添加/修改列
# 添加新列
df['是否高温'] = df['温度'] > 15
df['温度_华氏度'] = df['温度'] * 9/5 + 32
# 修改列名
df = df.rename(columns={'城市': 'city', '温度': 'temp'})
# 删除列
df = df.drop(columns=['是否高温'])
排序
# 按温度升序排序
df_sorted = df.sort_values('温度')
print(df_sorted)
# 按温度降序排序
df_sorted_desc = df.sort_values('温度', ascending=False)
# 多列排序
df.sort_values(['温度', '城市'], ascending=[True, False])
查找最大值/最小值(你的任务关键)
# 找到最高温度
max_temp = df['温度'].max()
max_city = df.loc[df['温度'].idxmax(), '城市']
print(f"最高温度:{max_city} {max_temp}℃")
# 找到最低温度
min_temp = df['温度'].min()
min_city = df.loc[df['温度'].idxmin(), '城市']
print(f"最低温度:{min_city} {min_temp}℃")
八、分组与聚合
# 假设我们有更多数据
data = {
'城市': ['北京', '北京', '上海', '上海', '广州', '广州'],
'日期': ['2023-01-01', '2023-01-02', '2023-01-01', '2023-01-02', '2023-01-01', '2023-01-02'],
'温度': [10, 12, 15, 14, 22, 21]
}
df = pd.DataFrame(data)
# 分组计算每个城市的平均温度
grouped = df.groupby('城市')['温度'].mean()
print(grouped)
"""
城市
上海 14.5
北京 11.0
广州 21.5
Name: 温度, dtype: float64
"""
# 多级聚合
agg_result = df.groupby('城市').agg({
'温度': ['mean', 'min', 'max', 'count']
})
print(agg_result)
九、处理缺失值
# 创建有缺失值的数据
data = {
'城市': ['北京', '上海', None, '广州'],
'温度': [14, None, 16, 20]
}
df = pd.DataFrame(data)
# 检查缺失值
print(df.isnull())
print(df.isnull().sum()) # 每列有多少缺失值
# 删除有缺失值的行
df_clean = df.dropna()
# 填充缺失值
df_filled = df.fillna({
'城市': '未知',
'温度': df['温度'].mean() # 用平均值填充
})
十、实践练习:解决你的任务
import pandas as pd
# 1. 读取数据
df = pd.read_csv('城市通量.csv', header=None, names=['城市', '温度'])
# 2. 确保温度是数值类型
df['温度'] = pd.to_numeric(df['温度'], errors='coerce')
# 3. 找到温度最低的行
min_temp = df['温度'].min()
min_cities = df[df['温度'] == min_temp]
# 4. 输出结果
if len(min_cities) == 1:
city = min_cities.iloc[0]['城市']
print(f"{city}, {min_temp}")
else:
# 如果有多个城市温度相同
cities = ', '.join(min_cities['城市'].tolist())
print(f"{cities}, {min_temp}")
十一、常用技巧总结
| 操作 | 代码示例 |
|---|---|
| 读取文件 | pd.read_csv('file.csv') |
| 保存文件 | df.to_csv('output.csv', index=False) |
| 查看数据 | df.head(), df.info(), df.describe() |
| 选择数据 | df[['列1', '列2']], df.iloc[0:5] |
| 条件筛选 | df[df['列'] > 10] |
| 排序 | df.sort_values('列', ascending=False) |
| 分组 | df.groupby('列').mean() |
| 聚合 | df.groupby('列').agg({'col': ['mean', 'sum']}) |
| 查找极值 | df['列'].max(), df['列'].idxmin() |
DataFrame的访问方式
一、基础属性访问
df.shape # (行数, 列数)
df.index # 行索引
df.columns # 列索引
df.dtypes # 每列数据类型
df.values # 转换为numpy数组
df.info() # DataFrame信息概览
df.describe() # 数值列统计信息
二、按标签访问(基于索引名)
1. loc[] - 基于标签的访问
# 访问单行(返回Series)
df.loc['2023001']
# 访问多行(返回DataFrame)
df.loc[['2023001', '2023002']]
# 访问行和列
df.loc['2023001', '姓名'] # 标量值
df.loc['2023001', ['姓名', '年龄']] # Series
df.loc[['2023001', '2023002'], '姓名'] # Series
df.loc[['2023001', '2023002'], ['姓名', '年龄']] # DataFrame
# 切片访问(包含两端)
df.loc['2023001':'2023003'] # 包含起始和结束行
df.loc['2023001':'2023003', '姓名':'年龄'] # 行和列都切片
2. 布尔索引
# 条件筛选
df.loc[df['年龄'] > 18] # 年龄大于18的行
df.loc[df['籍贯'] == '湖南'] # 籍贯为湖南的行
df.loc[(df['年龄'] > 18) & (df['籍贯'] == '湖南')] # 复合条件
三、按位置访问(基于整数位置)
1. iloc[] - 基于位置的访问
# 访问单行
df.iloc[0] # 第一行(返回Series)
df.iloc[-1] # 最后一行
# 访问多行
df.iloc[[0, 2, 4]] # 第1、3、5行
df.iloc[0:3] # 第1到3行(不包含第3行)
df.iloc[:3] # 前3行
df.iloc[-3:] # 后3行
# 访问行和列
df.iloc[0, 1] # 第1行第2列(标量)
df.iloc[0, [0, 2]] # 第1行的第1、3列
df.iloc[[0, 2], 1] # 第1、3行的第2列
df.iloc[0:3, 1:3] # 第1-3行,第2-3列
df.iloc[:, [0, 2]] # 所有行的第1、3列
四、按列名访问
1. 直接索引
# 访问单列(返回Series)
df['姓名']
df.姓名 # 点号访问(列名不能有空格和特殊字符)
# 访问多列(返回DataFrame)
df[['姓名', '年龄']]
2. 不推荐的方式(已弃用)
df.ix[] # 已弃用,混合了loc和iloc的功能
五、特殊访问方法
1. at[] 和 iat[] - 快速访问标量
df.at['2023001', '姓名'] # 快速访问单个值(基于标签)
df.iat[0, 1] # 快速访问单个值(基于位置)
2. 首尾行访问
df.head(n) # 前n行,默认n=5
df.tail(n) # 后n行,默认n=5
3. 条件筛选
# query方法(更简洁)
df.query('年龄 > 18')
df.query('籍贯 == "湖南"')
df.query('年龄 > 18 and 籍贯 == "湖南"')
六、修改数据
# 修改单个值
df.loc['2023001', '年龄'] = 20
df.at['2023001', '年龄'] = 20
# 修改整列
df['年龄'] = df['年龄'] + 1
df['成绩'] = [90, 85, 88, 92, 95] # 新增列
# 修改多行多列
df.loc['2023001':'2023003', '年龄'] = 20
七、常见场景对比
| 场景 | 推荐方法 | 示例 |
|---|---|---|
| 按学号查学生 | df.loc['学号'] | df.loc['2023001'] |
| 按位置查学生 | df.iloc[位置] | df.iloc[0] |
| 查最后一名 | df.iloc[-1] 或 df.tail(1) | df.iloc[-1] |
| 查特定列 | df['列名'] | df['姓名'] |
| 查多个学生 | df.loc[学号列表] | df.loc[['2023001', '2023002']] |
| 查多列 | df[列名列表] | df[['姓名', '年龄']] |
| 条件筛选 | df.loc[条件] | df.loc[df['年龄'] > 18] |
| 精确查值 | df.at[行标签, 列标签] | df.at['2023001', '姓名'] |
八、重要区别
-
locvsilocloc:使用标签索引,包含结束位置iloc:使用整数位置,不包含结束位置
-
单括号
[]vs 双括号[[]]df['列名']:返回Seriesdf[['列名']]:返回DataFramedf[['列1', '列2']]:返回多列DataFrame
-
选择行 vs 选择列
- 选择行:
df.loc[行索引]或df.iloc[行位置] - 选择列:
df['列名']或df[['列1', '列2']]
- 选择行:
这些访问方式可以根据具体需求灵活组合使用,是DataFrame数据处理的基础。