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

数据分析——Pandas库

Pandas是Python生态系统中最强大、最流行的数据分析库,专为处理结构化数据(如表格和时间序列)而设计。它提供了高效的数据结构和丰富的功能,使得数据清洗、转换、分析和可视化变得简单直观。

一、Pandas库的安装详解

1. 安装前的准备

在安装Pandas之前,建议先确保已安装Python环境(建议Python 3.6及以上版本)。可以通过以下命令检查Python版本:

python --version

python3 --version

2. 安装方法

方法一:使用pip安装(推荐)

这是最简单直接的安装方式:

pip install pandas

如果需要安装特定版本:

pip install pandas==1.3.5#本篇所用版本

方法二:使用conda安装(适合Anaconda用户)

conda install pandas

方法三:源码安装(适合开发者)

git clone https://github.com/pandas-dev/pandas.git
cd pandas
python setup.py install

3. 验证安装

安装完成后,可以通过以下方式验证:

import pandas as pd
print(pd.__version__)

4. 常见问题解决

安装速度慢

可以更换国内的镜像源:

pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

二、pandas的数据结构

pandas 主要提供了两种核心数据结构:

  1. Series(一维数组)

    • 类似于带标签的一维数组
    • 由两个数组组成:一个存储数据,一个存储索引(默认从0开始)
    • 示例:
      import pandas as pd
      s = pd.Series([1, 3, 5, 7], index=['a', 'b', 'c', 'd'])
      
    • 特性:
      • 支持向量化操作
      • 可以存储任意数据类型
      • 索引可以重复
  2. DataFrame(二维表格)

    • 类似于电子表格或SQL表
    • 由多个Series组成的字典结构
    • 示例:
      data = {'Name': ['Alice', 'Bob'], 'Age': [25, 30]}
      df = pd.DataFrame(data)
      
    • 特性:
      • 行索引(index)和列索引(columns)
      • 支持列的不同数据类型
      • 提供丰富的数据操作方法

这些数据结构为数据分析提供了强大的基础,支持从数据读取、清洗到分析的全流程操作。

三、pandas数据读取与写入

读取数据

pandas提供了多种方法来读取不同格式的数据文件:

1. 读取CSV文件

import pandas as pd# 基本读取
df = pd.read_csv('data.csv')# 带参数读取
df = pd.read_csv('data.csv', encoding='utf-8',header=0,  # 指定表头行index_col=0,  # 指定索引列na_values=['NA', 'N/A'])  # 指定缺失值标识

2. 读取Excel文件

# 读取单个sheet
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')# 读取整个Excel文件的所有sheet
excel_file = pd.ExcelFile('data.xlsx')
df1 = excel_file.parse('Sheet1')
df2 = excel_file.parse('Sheet2')

3. 读取JSON文件

df = pd.read_json('data.json', orient='records')

4. 读取SQL数据库

from sqlalchemy import create_engine# 创建数据库连接
engine = create_engine('sqlite:///database.db')# 读取数据
df = pd.read_sql('SELECT * FROM table_name', con=engine)

写入数据

pandas同样支持多种数据格式的输出:

1. 写入CSV文件

df.to_csv('output.csv',index=False,  # 不写入索引encoding='utf-8',columns=['col1', 'col2'])  # 指定写入的列

2. 写入Excel文件

# 写入单个sheet
df.to_excel('output.xlsx', sheet_name='Data')# 写入多个sheet
with pd.ExcelWriter('output.xlsx') as writer:df1.to_excel(writer, sheet_name='Sheet1')df2.to_excel(writer, sheet_name='Sheet2')

3. 写入JSON文件

df.to_json('output.json', orient='records')

4. 写入SQL数据库

# 写入新表
df.to_sql('new_table', con=engine, if_exists='fail')# 追加到现有表
df.to_sql('existing_table', con=engine, if_exists='append')

其他实用功能

1. 处理大文件

对于大文件可以使用分块读取:

chunk_size = 10000
chunks = pd.read_csv('large_file.csv', chunksize=chunk_size)for chunk in chunks:# 处理每个数据块process(chunk)

2. 数据类型指定

dtypes = {'col1': 'int32', 'col2': 'category'}
df = pd.read_csv('data.csv', dtype=dtypes)

3. 日期解析

df = pd.read_csv('data.csv', parse_dates=['date_column'])

四、pandas数据查看与检查

head()和tail()方法

  • df.head(n):查看DataFrame的前n行,默认显示前5行
    df.head(10)  # 查看前10行数据
    
  • df.tail(n):查看DataFrame的后n行,默认显示后5行
    df.tail(3)  # 查看最后3行数据
    

数据概览

  • df.shape:查看DataFrame的形状(行数,列数)
    print(df.shape)  # 输出类似(1000, 15)表示1000行15列
    
  • df.info():查看数据集的整体信息
    • 显示每列的非空值数量
    • 每列的数据类型
    • 内存使用情况
    df.info()  # 输出各列详细信息
    

数据统计信息检查

describe()方法

  • df.describe():生成描述性统计信息
    • 数值型列:计数、均值、标准差、最小值、四分位数、最大值
    • 非数值型列:计数、唯一值数量、频数最高的值及其出现次数
    df.describe(include='all')  # 包含所有列
    df.describe(include=['float64'])  # 只包含浮点数列
    

唯一值和频率统计

  • df.nunique():查看每列的唯一值数量
    df.nunique()  # 各列唯一值数量
    
  • df.value_counts():查看某列的值分布
    df['gender'].value_counts(normalize=True)  # 显示比例而非计数
    

数据类型和缺失值检查

数据类型检查

  • df.dtypes:查看各列的数据类型
    print(df.dtypes)  # 输出各列数据类型
    
  • 类型转换示例:
    df['date'] = pd.to_datetime(df['date'])  # 转换为日期类型
    df['price'] = df['price'].astype(float)  # 转换为浮点数
    

缺失值检查

  • df.isnull():返回布尔矩阵,显示每个元素是否为缺失值
    df.isnull().sum()  # 统计每列缺失值数量
    
  • 缺失值可视化:
    import matplotlib.pyplot as plt
    import seaborn as snssns.heatmap(df.isnull(), cbar=False)
    plt.show()
    

更高级的数据检查方法

数据抽样

  • df.sample():随机抽样查看数据
    df.sample(5)  # 随机查看5行
    df.sample(frac=0.1)  # 抽取10%的数据
    

条件筛选检查

  • 使用布尔索引筛选特定数据
    # 查看年龄大于30的记录
    df[df['age'] > 30]# 查看特定城市和性别的记录
    df[(df['city'] == 'Beijing') & (df['gender'] == 'Female')]
    

重复值检查

  • df.duplicated():检查重复行
    df.duplicated().sum()  # 统计重复行数
    df[df.duplicated()]  # 查看重复行
    
  • 特定列重复检查:
    df.duplicated(subset=['id', 'date']).sum()  # 检查ID和日期组合是否重复
    

五、pandas数据选择与过滤

1. 列选择
列选择是最基础的数据操作之一,通过列名来获取指定列的数据。

### 单列选择
```python
df['Name']  # 返回Name列的所有数据,返回类型为Series

多列选择

df[['Name', 'Age']]  # 返回包含Name和Age两列的数据,返回类型为DataFrame

应用场景:当只需要分析特定几列数据时使用,例如只需要查看客户的姓名和年龄信息。

2. 行选择

行选择可以通过标签或位置索引来获取数据。

按标签选择行(loc)

df.loc[0]        # 返回索引标签为0的行数据
df.loc[0:2]      # 返回索引标签从0到2的行数据(包含2)

按位置选择行(iloc)

df.iloc[0]       # 返回第一行数据(位置索引从0开始)
df.iloc[0:3]     # 返回第1到第3行数据(不包含3)

注意事项

  • loc是基于标签的索引,包含结束位置
  • iloc是基于位置的索引,不包含结束位置

3. 条件过滤

条件过滤可以根据特定条件筛选出符合要求的数据行。

简单条件过滤

df[df['Age'] > 30]  # 筛选出年龄大于30岁的所有记录

多条件组合过滤

df[(df['Age'] > 25) & (df['City'] == 'NY')]  # 筛选年龄大于25岁且居住在NY的记录

示例说明:假设我们有一个客户数据集,包含Name、Age、City等字段。使用多条件过滤可以快速找到特定城市的特定年龄段客户。

运算符说明

  • & 表示逻辑与
  • | 表示逻辑或
  • ~ 表示逻辑非

注意:多个条件必须用括号括起来,否则会报错。

六、数据处理

1. 缺失值处理

缺失值是数据分析中常见的问题,pandas提供了多种处理方式:

删除缺失值

df.dropna()  # 默认删除包含任何缺失值的整行
df.dropna(axis=1)  # 删除包含缺失值的列
df.dropna(thresh=3)  # 只保留至少有3个非缺失值的行

填充缺失值

df.fillna(0)  # 用0填充所有缺失值
df.fillna({'Salary': df['Salary'].mean(), 'Age': 30})  # 对不同列使用不同填充值
df.fillna(method='ffill')  # 用前一个有效值向前填充

缺失值检测

df.isnull()  # 返回布尔DataFrame,显示每个位置是否为缺失值
df.isnull().sum()  # 计算每列的缺失值数量
df[df['Age'].isnull()]  # 筛选出Age列为缺失值的行

2. 重复值处理

重复数据会影响分析结果,常见的处理方法包括:

df.drop_duplicates()  # 删除完全相同的行
df.drop_duplicates(subset=['Name', 'Phone'])  # 基于指定列判断重复
df.drop_duplicates(keep='last')  # 保留最后一次出现的重复行
df.drop_duplicates(keep=False)  # 删除所有重复行

3. 数据排序

数据排序有助于发现模式和异常值:

df.sort_values('Age')  # 按年龄升序排序
df.sort_values('Age', ascending=False)  # 按年龄降序排序
df.sort_values(['Department', 'Salary'], ascending=[True, False])  # 多列排序
df.sort_index()  # 按索引排序

4. 数据分组

分组是数据分析的核心操作,可用于计算各种统计量:

# 基本分组
df.groupby('City')['Age'].mean()  # 按城市分组计算平均年龄# 多重分组
df.groupby(['City', 'Gender'])['Income'].median()  # 按城市和性别分组计算收入中位数# 多聚合函数
df.groupby('Department').agg({'Salary': ['mean', 'max', 'min'],'Age': 'median'
})# 分组后应用自定义函数
def top_earners(group):return group.nlargest(3, 'Salary')df.groupby('Department').apply(top_earners)

    七、数据转换

    1.添加新列 通过布尔条件创建新列是数据预处理中的常见操作:

    df['Senior'] = df['Age'] > 30  # 添加布尔列,标记年龄大于30岁的员工
    

    示例应用场景:在人力资源数据分析中,可以用此方法快速区分资深员工和普通员工,便于后续分组分析。

    2.应用函数 使用apply方法可以对列数据进行函数处理:

    df['Name_Length'] = df['Name'].apply(len)  # 计算每个姓名的字符长度
    df['Salary_Adjusted'] = df['Salary'].apply(lambda x: x*1.1)  # 工资上调10%
    

    最佳实践:当需要执行复杂转换时,可以定义单独的函数然后传入apply,提高代码可读性3

    3.数据合并 Pandas提供多种数据合并方式: 纵向合并(堆叠):

    pd.concat([df1, df2], axis=0)  # 默认纵向合并,相同结构的两个表格上下拼接
    pd.concat([df1, df2], ignore_index=True)  # 重建索引
    

    横向合并(连接):

    # 内连接,基于共同键值合并
    pd.merge(df1, df2, on='employee_id', how='inner')# 左连接,保留左边表的所有记录
    pd.merge(df1, df2, on='department', how='left')# 外连接,保留所有记录
    pd.merge(df1, df2, on='project_id', how='outer')
    

    合并操作常用于:将分散在不同表中的相关数据整合到一起,比如将员工信息表与部门信息表合并。

    http://www.lryc.cn/news/613477.html

    相关文章:

  1. 什么是 TDengine IDMP?
  2. 机试备考笔记 7/31
  3. 学习设计模式《二十一》——装饰模式
  4. 人生后半场:从广度到深度的精进之路
  5. 设计模式中的行为模式
  6. 多线程 future.get()的线程阻塞是什么意思?
  7. tcpdump问题记录
  8. 【多重BFS】Monsters
  9. 【实时Linux实战系列】基于实时Linux的高频交易系统构建
  10. 【C语言】深入理解编译与链接过程
  11. 数据标注之数据集的类型与如何标注
  12. 时间并非维度:论其作为空间变化的转换系数
  13. 大模型LL04 微调prompt-Tuning方法入门(背景与发展)
  14. 深度学习的视觉惯性里程计(VIO)算法优化实践
  15. 数据结构学习之二叉树
  16. 深度学习(2):自动微分
  17. LSTM 单变量时序预测—pytorch
  18. JAVA第六学:数组的使用
  19. 【数据结构】二叉树练习
  20. S7-1200 串行通信介绍
  21. 一场 Dark Theme A/B 测试的复盘与提效实践
  22. Linux上MySql CPU 占用异常
  23. SpringBoot中的单例注入方式
  24. windows有一个企业微信安装包,脚本执行并安装到d盘。
  25. VSCode ssh一直在Setting up SSH Host xxx: Copying VS Code Server to host with scp等待
  26. 开发避坑指南(20) :MyBatis操作Oracle插入NULL值异常“无效列类型1111“解决方案
  27. DrissionPage实战案例:小红书旅游数据爬取
  28. TDengine IDMP 文档介绍
  29. 腾讯位置服务 —— 预估订单路线金额(使用Drools规则引擎处理)
  30. 机器学习在量化中的应用:如何从逻辑回归到XGBoost实现高效预测?