当前位置: 首页 > news >正文

从零开始学 Pandas:数据处理核心操作指南

目录

一、数据的导入与导出:数据处理的第一步

1. 读取不同格式的文件

2. 数据导出

二、数据清洗:让数据更 "干净"

1. 缺失值处理

2. 重复值处理

三、数据抽取与转换:精准获取所需信息

1. 条件抽取

2. 字符串截取:slice 函数

3. 数据计算

四、数据合并:整合多源信息

1. 列的合并

2. 数据框的合并

五、高级处理:抽样、标准化与分组

1. 随机抽样

2. 数据标准化

3. 数据分组


在数据分析领域,Pandas 库无疑是 Python 生态中最强大的工具之一。它以简洁的语法和高效的性能,成为数据清洗、转换、分析的首选工具。本文将结合实际代码案例,带你系统学习 Pandas 的核心操作,从数据导入到高级处理,逐步掌握数据处理的全流程。

一、数据的导入与导出:数据处理的第一步

任何数据分析都始于数据的获取,Pandas 提供了丰富的函数支持多种格式文件的读写,让数据导入导出变得简单高效。

1. 读取不同格式的文件

  • CSV 文件:使用read_csv函数,支持指定编码(如utf-8gbk)和引擎参数。当数据包含中文时,encoding='gbk'是常见选择。
    import pandas as pd
    # 读取带表头的CSV
    df1 = pd.read_csv("data1.csv")
    # 读取无表头的CSV(指定header=None)
    df2 = pd.read_csv("data2.csv", encoding='utf8', engine='python', header=None)
    
  • Excel 文件:通过read_excel直接读取.xlsx 文件:
    df3 = pd.read_excel("data3.xlsx")
    
  • TXT 文件:使用read_table,需指定分隔符(如逗号分隔的 txt 可用sep=','):
    df4 = pd.read_table("data4.txt", sep=',', header=None)
    

2. 数据导出

处理完成的数据可通过to_csvto_excel导出,indexheader参数控制是否保留行索引和列名:

# 导出为CSV
df1.to_csv("导出.csv", index=True, header=True)
# 导出为Excel
df1.to_excel("导出.xlsx", index=True, header=True)

二、数据清洗:让数据更 "干净"

原始数据往往存在缺失值、重复值等问题,直接分析会导致结果偏差。Pandas 提供了针对性的处理工具,让数据清洗事半功倍。

1. 缺失值处理

缺失值是数据中最常见的问题,Pandas 提供了三种核心处理思路:

  • 识别缺失值:用isnull()判断空值位置,结合any(axis=1)可定位包含空值的行:

    # 判断空值位置
    na = df.isnull()
    # 提取含空值的行
    df[na.any(axis=1)]
    # 提取特定列含空值的行(如gender列)
    df[na[['gender']].any(axis=1)]
    
  • 填充缺失值:使用fillna用指定值(如字符串、数值)填充空值:

    # 用'1'填充所有缺失值
    df1 = df.fillna('1')
    
  • 删除缺失值:通过dropna删除包含空值的行(默认删除任何含空值的行):

    # 删除所有含空值的行
    df2 = df.dropna()
    

2. 重复值处理

重复数据会干扰分析结果,需先识别再处理:

  • 识别重复值duplicated()返回布尔值判断是否重复,支持按特定列判断:

    # 判断全行重复
    result1 = df.duplicated()
    # 按gender列判断重复
    result2 = df.duplicated('gender')
    # 按gender和name列联合判断重复
    result3 = df.duplicated(['gender', 'name'])
    
  • 删除重复值drop_duplicates可删除重复行,同样支持按列筛选:

    # 删除全行重复的行
    new_df1 = df.drop_duplicates()
    # 按name和gender列删除重复行
    new_df2 = df.drop_duplicates(['name', 'gender'])
    

三、数据抽取与转换:精准获取所需信息

数据清洗后,需根据分析目标抽取关键信息,或对数据进行转换处理。

1. 条件抽取

通过逻辑判断筛选符合条件的数据,是数据分析的基础操作:

  • 比较运算:如筛选好评数大于 17000 的记录,或在某个区间内的记录:

    # 好评数>17000
    df[df['好评数'] > 17000]
    # 好评数在15000-17000之间
    df[df['好评数'].between(15000, 17000)]
    
  • 字符匹配:用str.contains筛选包含特定字符的记录(na=False忽略空值):

    # 筛选品牌含"苹果"的记录
    df[df['品牌'].str.contains('苹果', na=False)]
    
  • 逻辑运算:结合&(且)、|(或)实现多条件筛选:

    # 价格<7000且好评数>16000
    df[(df['价格']<7000) & (df['好评数'] > 16000)]
    

2. 字符串截取:slice 函数

对字符串类型数据,可通过str.slice截取指定位置的字符,例如从身份证号中提取信息:

# 将id转为字符串类型(避免数值截取错误)
df['id'] = df['id'].astype(str)
# 提取前6位(地址码)
area = df['id'].str.slice(0, 6)
# 提取6-14位(出生日期码)
birthday = df['id'].str.slice(6, 14)

3. 数据计算

Pandas 支持直接对列进行算术运算,快速生成新指标:

# 计算总价(单价×数量)
df['总价'] = df['单价'] * df['数量']

四、数据合并:整合多源信息

实际分析中,数据往往分散在多个表格中,需通过合并操作整合为完整数据集。

1. 列的合并

通过+直接拼接多个列,生成新列(需确保列类型一致,通常转为字符串):

# 将area、birthday等列拼接为id
df = df.astype(str)
df['id'] = df['area'] + df['birthday'] + df['ranking'] + df['only']

2. 数据框的合并

  • concat 函数:支持横向(axis=1)或竖向(默认axis=0)合并,join参数控制交集(inner)或并集(outer):

    # 竖向合并(行拼接)
    new_df1 = pd.concat([df2, df1])
    # 横向合并(列拼接),取交集
    new_df3 = pd.concat([df1, df3], axis=1, join='inner')
    
  • merge 函数:按指定键(如姓名)合并,支持内连接、左连接、右连接、外连接:

    # 按name内连接(仅保留双方都有的name)
    df3 = pd.merge(df1, df2, left_on='name', right_on='name')
    # 左连接(保留df1所有name)
    df4 = pd.merge(df1, df2, left_on='name', right_on='name', how='left')
    

五、高级处理:抽样、标准化与分组

1. 随机抽样

通过sample函数实现随机抽样,支持按个数(n)或比例(frac)抽样,replace控制是否有放回:

import numpy as np
# 设置随机种子(保证结果可复现)
np.random.seed(seed=2)
# 按个数不放回抽样(10条)
df.sample(n=10)
# 按比例有放回抽样(20%)
new_df = df.sample(frac=0.2, replace=True)

2. 数据标准化

为消除不同指标的量纲影响,需进行标准化处理,常见方法有:

  • 0~1 标准化:将数据映射到 [0,1] 区间:

    # 国内生产总值0~1标准化
    df1['国内生产总值0~1标准化'] = round((df1.国内生产总值 - df1.国内生产总值.min()) / (df1.国内生产总值.max() - df1.国内生产总值.min()), 2
    )
    
  • Z 标准化:将数据转换为均值为 0、方差为 1 的分布:

    # 国内生产总值Z标准化
    df1['国内生产总值Z标准化'] = round((df1.国内生产总值 - df1.国内生产总值.mean()) / df1.国内生产总值.std(), 2
    )
    

3. 数据分组

cut函数将连续数据离散化(分组),需指定分组边界(bins)和标签(labels):

# 定义人均GDP分组边界
bins = [min(df.人均GDP)-1, 2000, 4000, 6000, 8000, max(df.人均GDP)+1]
# 自定义分组标签
labels = ['2000以下', '2001~4000', '4001~6000', '6001~8000', '8000以上']
# 分组并添加到数据框
df['人均GDP分组'] = pd.cut(df.人均GDP, bins, labels=labels)
http://www.lryc.cn/news/599012.html

相关文章:

  • 清除浮动以及原理
  • cri-docker部署高版本k8s
  • 闲庭信步使用图像验证平台加速FPGA的开发:第三十四课——车牌识别的FPGA实现(6)叠加车牌识别的信息
  • 5.7 input子系统
  • RocketMQ集群高级特性
  • 洛谷刷题7.24
  • 办公自动化入门:如何高效将图片整合为PDF文档
  • 精通Python PDF裁剪:从入门到专业的三重境界
  • 读书笔记(黄帝内经)
  • 【CMake】CMake 常用语法总结
  • 【STM32】FreeRTOS 任务的创建(二)
  • Bright Data 实战指南:从竞品数据抓取到电商策略优化全流程
  • 深度分析Java类加载机制
  • 【C# 找最大值、最小值和平均值及大于个数和值】2022-9-23
  • 行为型模式-协作与交互机制
  • 基于Matlab图像处理的水果分级系统
  • OpenCV(03)插值方法,边缘填充,透视变换,水印制作,噪点消除
  • 【计算机网络】第六章:应用层
  • 【OpenCV实现多图像拼接】
  • jax study notes[19]
  • Python:Matplotlib笔记
  • 季逸超:Manus的上下文工程启示
  • JMeter压测黑马点评优惠券秒杀的配置及请求爆红问题的解决(详细图解)
  • 基于20和28 nm FPGAs的实现多通道、低非线性时间到数字转换器
  • Android15或AndroidU广播的发送流程
  • Redis学习:持久化与事务(Transaction)
  • 如何查看docker实例是否挂载目录,以及挂载了哪些目录
  • 浏览器访问[http://www.taobao.com](http://www.taobao.com/),经历了怎样的过程。
  • NOTEPAD!NPCommand函数分析之comdlg32!GetSaveFileNameW--windows记事本源代码分析
  • Python 程序设计讲义(15):Python 的数据运算——位运算