数据分析——Pandas库

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

一、Pandas库的安装详解

1. 安装前的准备

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

bash 复制代码
python --version

bash 复制代码
python3 --version

2. 安装方法

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

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

bash 复制代码
pip install pandas

如果需要安装特定版本:

bash 复制代码
pip install pandas==1.3.5#本篇所用版本

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

bash 复制代码
conda install pandas

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

bash 复制代码
git clone https://github.com/pandas-dev/pandas.git
cd pandas
python setup.py install

3. 验证安装

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

python 复制代码
import pandas as pd
print(pd.__version__)

4. 常见问题解决

安装速度慢

可以更换国内的镜像源:

bash 复制代码
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

二、pandas的数据结构

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

  1. Series(一维数组)

    • 类似于带标签的一维数组

    • 由两个数组组成:一个存储数据,一个存储索引(默认从0开始)

    • 示例:

      python 复制代码
      import pandas as pd
      s = pd.Series([1, 3, 5, 7], index=['a', 'b', 'c', 'd'])
    • 特性:

      • 支持向量化操作
      • 可以存储任意数据类型
      • 索引可以重复
  2. DataFrame(二维表格)

    • 类似于电子表格或SQL表

    • 由多个Series组成的字典结构

    • 示例:

      python 复制代码
      data = {'Name': ['Alice', 'Bob'], 'Age': [25, 30]}
      df = pd.DataFrame(data)
    • 特性:

      • 行索引(index)和列索引(columns)
      • 支持列的不同数据类型
      • 提供丰富的数据操作方法

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

三、pandas数据读取与写入

读取数据

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

1. 读取CSV文件

python 复制代码
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文件

python 复制代码
# 读取单个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文件

python 复制代码
df = pd.read_json('data.json', orient='records')

4. 读取SQL数据库

python 复制代码
from sqlalchemy import create_engine

# 创建数据库连接
engine = create_engine('sqlite:///database.db')

# 读取数据
df = pd.read_sql('SELECT * FROM table_name', con=engine)

写入数据

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

1. 写入CSV文件

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

2. 写入Excel文件

python 复制代码
# 写入单个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文件

python 复制代码
df.to_json('output.json', orient='records')

4. 写入SQL数据库

python 复制代码
# 写入新表
df.to_sql('new_table', con=engine, if_exists='fail')

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

其他实用功能

1. 处理大文件

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

python 复制代码
chunk_size = 10000
chunks = pd.read_csv('large_file.csv', chunksize=chunk_size)

for chunk in chunks:
    # 处理每个数据块
    process(chunk)

2. 数据类型指定

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

3. 日期解析

python 复制代码
df = pd.read_csv('data.csv', parse_dates=['date_column'])

四、pandas数据查看与检查

head()和tail()方法

  • df.head(n):查看DataFrame的前n行,默认显示前5行

    python 复制代码
    df.head(10)  # 查看前10行数据
  • df.tail(n):查看DataFrame的后n行,默认显示后5行

    python 复制代码
    df.tail(3)  # 查看最后3行数据

数据概览

  • df.shape:查看DataFrame的形状(行数,列数)

    python 复制代码
    print(df.shape)  # 输出类似(1000, 15)表示1000行15列
  • df.info():查看数据集的整体信息

    • 显示每列的非空值数量
    • 每列的数据类型
    • 内存使用情况
    python 复制代码
    df.info()  # 输出各列详细信息

数据统计信息检查

describe()方法

  • df.describe():生成描述性统计信息

    • 数值型列:计数、均值、标准差、最小值、四分位数、最大值
    • 非数值型列:计数、唯一值数量、频数最高的值及其出现次数
    python 复制代码
    df.describe(include='all')  # 包含所有列
    df.describe(include=['float64'])  # 只包含浮点数列

唯一值和频率统计

  • df.nunique():查看每列的唯一值数量

    python 复制代码
    df.nunique()  # 各列唯一值数量
  • df.value_counts():查看某列的值分布

    python 复制代码
    df['gender'].value_counts(normalize=True)  # 显示比例而非计数

数据类型和缺失值检查

数据类型检查

  • df.dtypes:查看各列的数据类型

    python 复制代码
    print(df.dtypes)  # 输出各列数据类型
  • 类型转换示例:

    python 复制代码
    df['date'] = pd.to_datetime(df['date'])  # 转换为日期类型
    df['price'] = df['price'].astype(float)  # 转换为浮点数

缺失值检查

  • df.isnull():返回布尔矩阵,显示每个元素是否为缺失值

    python 复制代码
    df.isnull().sum()  # 统计每列缺失值数量
  • 缺失值可视化:

    python 复制代码
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    sns.heatmap(df.isnull(), cbar=False)
    plt.show()

更高级的数据检查方法

数据抽样

  • df.sample():随机抽样查看数据

    python 复制代码
    df.sample(5)  # 随机查看5行
    df.sample(frac=0.1)  # 抽取10%的数据

条件筛选检查

  • 使用布尔索引筛选特定数据

    python 复制代码
    # 查看年龄大于30的记录
    df[df['age'] > 30]
    
    # 查看特定城市和性别的记录
    df[(df['city'] == 'Beijing') & (df['gender'] == 'Female')]

重复值检查

  • df.duplicated():检查重复行

    python 复制代码
    df.duplicated().sum()  # 统计重复行数
    df[df.duplicated()]  # 查看重复行
  • 特定列重复检查:

    python 复制代码
    df.duplicated(subset=['id', 'date']).sum()  # 检查ID和日期组合是否重复

五、pandas数据选择与过滤

1. 列选择

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

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

多列选择

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

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

2. 行选择

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

按标签选择行(loc)

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

按位置选择行(iloc)

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

注意事项

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

3. 条件过滤

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

简单条件过滤

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

多条件组合过滤

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

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

运算符说明

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

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

六、数据处理

1. 缺失值处理

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

删除缺失值

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

填充缺失值

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

缺失值检测

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

2. 重复值处理

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

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

3. 数据排序

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

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

4. 数据分组

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

python 复制代码
# 基本分组
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.添加新列 通过布尔条件创建新列是数据预处理中的常见操作:

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

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

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

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

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

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

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

横向合并(连接):

python 复制代码
# 内连接,基于共同键值合并
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')

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