pandas基础操作

文章目录

    • [1. Series 与 DataFrame](#1. Series 与 DataFrame)
    • [2. 数据查看与基本信息获取](#2. 数据查看与基本信息获取)
    • [3. 数据选择与筛选](#3. 数据选择与筛选)
    • [4. 数据清洗与预处理](#4. 数据清洗与预处理)
    • [5. 数据排序与重置索引](#5. 数据排序与重置索引)
    • [6. 数据分组与聚合分析](#6. 数据分组与聚合分析)
    • [7. 数据合并](#7. 数据合并)

1. Series 与 DataFrame

Series:一维带标签数组,类似于 Excel 中的单列数据

python 复制代码
import pandas as pd
import numpy as np

# 创建 Series 的几种方式
s1 = pd.Series([10, 20, 30, 40])                    # 默认整数索引
s2 = pd.Series([100, 200, 300], index=['a', 'b', 'c'])  # 自定义标签索引
s3 = pd.Series({'北京': 2154, '上海': 2428, '广州': 1867})  # 从字典创建

DataFrame:二维表格型数据结构,是数据分析的主要载体

python 复制代码
# 创建 DataFrame
df = pd.DataFrame({
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [25, 30, 35, 28],
    '城市': ['北京', '上海', '广州', '深圳'],
    '工资': [8000, 12000, 15000, 10000]
})

# 从文件读取数据(最常用)
df_csv = pd.read_csv('data.csv')        # 读取 CSV 文件
df_excel = pd.read_excel('data.xlsx')   # 读取 Excel 文件
df_json = pd.read_json('data.json')     # 读取 JSON 文件

2. 数据查看与基本信息获取

Pandas 提供了多种快速查看数据的方法。

python 复制代码
# 查看数据前几行和后几行
df.head(3)      # 查看前3行,默认5行
df.tail(2)      # 查看后2行,默认5行
df.sample(3)    # 随机查看3行,了解数据分布

# 获取数据基本信息
print(f"数据形状: {df.shape}")          # 输出 (行数, 列数)
print(f"数据维度: {df.ndim}")           # 维度数(DataFrame为2)

# 查看数据类型和内存信息
df.info()        # 显示各列数据类型、非空值数量和内存使用
df.dtypes        # 只查看各列数据类型
df.memory_usage() # 查看各列内存使用情况

# 数值型数据的统计摘要
df.describe()    # 显示计数、均值、标准差、最小值、四分位数、最大值
df.describe(include='all')  # 包含所有类型列的统计

3. 数据选择与筛选

选择列数据

python 复制代码
# 选择单列 - 返回 Series
年龄列 = df['年龄']

# 选择多列 - 返回 DataFrame
姓名年龄 = df[['姓名', '年龄']]

# 使用点表示法(列名需符合变量命名规则)
df.年龄  # 等价于 df['年龄']

选择行数据

python 复制代码
# 按标签选择(loc) - 使用索引标签
df.loc[0]           # 选择索引为0的行
df.loc[0:2]         # 选择索引0到2的行(包含2)
df.loc[[0, 2, 3]]   # 选择索引为0,2,3的行

# 按位置选择(iloc) - 使用整数位置
df.iloc[0]          # 选择第0行(从0开始计数)
df.iloc[0:3]        # 选择第0到2行(不包含3)
df.iloc[[0, 2]]     # 选择第0和第2行

# 布尔索引(条件筛选)
df[df['年龄'] > 30]                     # 年龄大于30的行
df[(df['年龄'] > 25) & (df['工资'] < 12000)]  # 多条件筛选
df[df['城市'].isin(['北京', '上海'])]    # 城市在北京或上海
df[~df['城市'].isin(['广州'])]          # 城市不是广州(~表示取反)

4. 数据清洗与预处理

数据清洗用来在数据分析中确保数据质量。

处理缺失值

python 复制代码
# 检测缺失值
df.isnull()          # 返回布尔DataFrame,显示每个单元格是否为空
df.isnull().sum()    # 统计每列缺失值数量
df.isnull().any()    # 检查每列是否有缺失值

# 处理缺失值
df.dropna()                     # 删除包含任何缺失值的行
df.dropna(axis=1)              # 删除包含任何缺失值的列
df.dropna(subset=['年龄', '工资'])  # 只删除指定列有缺失值的行

df.fillna(0)                   # 用0填充所有缺失值
df.fillna({'年龄': df['年龄'].mean()})  # 年龄列用平均值填充
df.fillna(method='ffill')      # 用前一个有效值填充(前向填充)
df.fillna(method='bfill')      # 用后一个有效值填充(后向填充)

# 插值填充
df.interpolate()               # 线性插值填充

处理重复数据

python 复制代码
# 检测重复行
df.duplicated()                # 标记重复行(除第一次出现外)
df.duplicated().sum()          # 统计重复行数量

# 删除重复行
df.drop_duplicates()                      # 删除完全重复的行
df.drop_duplicates(subset=['姓名'])       # 基于姓名列删除重复
df.drop_duplicates(subset=['姓名'], keep='last')  # 保留最后一次出现

数据类型转换

python 复制代码
# 转换数据类型
df['年龄'] = df['年龄'].astype('int32')      # 转换为32位整数
df['工资'] = df['工资'].astype('float64')    # 转换为双精度浮点数
df['入职日期'] = pd.to_datetime(df['入职日期'])  # 转换为日期时间

# 重命名列
df.rename(columns={'旧列名': '新列名'}, inplace=True)  # 重命名单个列
df.rename(columns={'姓名': '员工姓名', '年龄': '员工年龄'}, inplace=True)  # 重命名多个列
df.columns = ['列1', '列2', '列3']  # 重命名所有列

5. 数据排序与重置索引

排序和索引操作用来对数据进行组织和整理。

python 复制代码
# 按值排序
df.sort_values('年龄')                    # 按年龄升序排序
df.sort_values('年龄', ascending=False)   # 按年龄降序排序
df.sort_values(['城市', '年龄'])          # 先按城市排序,再按年龄排序
df.sort_values(['城市', '年龄'], ascending=[True, False])  # 城市升序,年龄降序

# 按索引排序
df.sort_index()              # 按索引升序排序
df.sort_index(ascending=False)  # 按索引降序排序

# 重置索引
df.reset_index()                     # 将索引转换为列,新建默认整数索引
df.reset_index(drop=True)           # 直接重置为整数索引,不保留原索引
df.reset_index(drop=True, inplace=True)  # 原地修改,不创建新对象

6. 数据分组与聚合分析

分组聚合是数据分析的核心,用于计算分组统计量。

python 复制代码
# 基本分组操作
按城市分组 = df.groupby('城市')           # 按城市分组
按城市分组.groups                        # 查看分组结果
按城市分组.size()                       # 查看每组大小

# 单列聚合
df.groupby('城市')['工资'].mean()        # 按城市计算平均工资
df.groupby('城市')['工资'].sum()         # 按城市计算工资总和
df.groupby('城市')['年龄'].max()         # 按城市计算最大年龄
df.groupby('城市')['年龄'].min()         # 按城市计算最小年龄
df.groupby('城市')['姓名'].count()       # 按城市统计人数

# 多列聚合
df.groupby('城市').agg({
    '年龄': ['mean', 'min', 'max'],
    '工资': ['sum', 'mean', 'std']
})

# 命名聚合结果
df.groupby('城市').agg(
    平均年龄=('年龄', 'mean'),
    最高工资=('工资', 'max'),
    人数=('姓名', 'count')
)

# 多级分组
df.groupby(['城市', '年龄']).mean()     # 按城市和年龄两级分组

7. 数据合并

在实际项目中,数据往往来自多个源,需要合并处理。

纵向合并(添加行)

python 复制代码
# 简单合并(要求列相同)
df_all = pd.concat([df1, df2, df3])          # 默认纵向合并
df_all = pd.concat([df1, df2], ignore_index=True)  # 忽略原索引,创建新索引

# 处理不同列的情况
df_all = pd.concat([df1, df2], sort=False)   # 保留所有列,缺失值填充NaN

横向合并(添加列)

python 复制代码
# 简单横向合并(要求行数相同)
df_combined = pd.concat([df1, df2], axis=1)
相关推荐
EveryPossible2 小时前
宽度撑开容器
学习
深蓝海拓2 小时前
PySide6从0开始学习的笔记(八) 控件(Widget)之QSlider(滑动条)
笔记·python·qt·学习·pyqt
TL滕2 小时前
从0开始学算法——第十九天(并查集练习)
笔记·学习·算法
im_AMBER2 小时前
Leetcode 80 统计一个数组中好对子的数目
数据结构·c++·笔记·学习·算法·leetcode
dazzle2 小时前
《DataFrame可视化与高级方法》
python·pandas
千殇华来2 小时前
XMOS学习笔记
人工智能·笔记·学习
峥嵘life2 小时前
Android16 EDLA 认证BTS测试Failed解决总结
android·java·linux·运维·学习
白帽子凯哥哥2 小时前
零基础转行网络安全需要多长时间?具体的学习路径是怎样的?
学习·安全·web安全
从零点3 小时前
STM32学习笔记CAN
笔记·stm32·学习