404Found
发布于 2025-12-24 / 10 阅读
0
0

🐼 Pandas 入门指南

🐼 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', '姓名']

八、重要区别

  1. loc vs iloc

    • loc:使用标签索引,包含结束位置
    • iloc:使用整数位置,不包含结束位置
  2. 单括号[] vs 双括号[[]]

    • df['列名']:返回Series
    • df[['列名']]:返回DataFrame
    • df[['列1', '列2']]:返回多列DataFrame
  3. 选择行 vs 选择列

    • 选择行:df.loc[行索引]df.iloc[行位置]
    • 选择列:df['列名']df[['列1', '列2']]

这些访问方式可以根据具体需求灵活组合使用,是DataFrame数据处理的基础。


评论