Python数据分析入门:Pandas使用指南

Pandas简介及Python中的使用指南

什么是Pandas?

Pandas是一个开源的Python数据分析库,提供了高性能、易用的数据结构和数据分析工具。它建立在NumPy之上,使得在Python中进行数据操作和分析变得更加简单高效。Pandas这个名字来源于"Panel Data"(面板数据)和"Python Data Analysis"(Python数据分析)的组合。

Pandas的两个主要数据结构是:

  • Series:一维数组,类似于Python中的列表,但带有索引功能
  • DataFrame:二维表格型数据结构,可以看作是由多个Series组成的字典

安装Pandas

在开始使用Pandas之前,需要先安装它。可以使用pip进行安装:

pip install pandas

或者使用conda(如果你使用Anaconda发行版):

conda install pandas

Pandas基础使用示例

1. 创建DataFrame

import pandas as pd

# 从字典创建DataFrame
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [25, 30, 35, 40],
    '城市': ['北京', '上海', '广州', '深圳']
}
df = pd.DataFrame(data)
print(df)

# 从列表创建DataFrame
data_list = [
    ['张三', 25, '北京'],
    ['李四', 30, '上海'],
    ['王五', 35, '广州'],
    ['赵六', 40, '深圳']
]
df = pd.DataFrame(data_list, columns=['姓名', '年龄', '城市'])

2. 读取和写入数据

Pandas支持多种数据格式的读写:

# 读取CSV文件
df = pd.read_csv('data.csv', encoding='utf-8')  # 指定编码格式

# 读取Excel文件
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')  # 指定工作表

# 写入CSV文件
df.to_csv('output.csv', index=False, encoding='utf-8-sig')  # 避免中文乱码

# 写入Excel文件
df.to_excel('output.xlsx', index=False, sheet_name='数据')

# 支持的其他格式:JSON, SQL, HTML, Parquet等

3. 数据查看与选择

# 查看数据基本信息
print(df.info())  # 数据类型、内存使用等
print(df.describe())  # 数值列统计信息

# 查看前5行
print(df.head())

# 查看后3行
print(df.tail(3))

# 选择单列
ages = df['年龄']  # 或 df.年龄

# 选择多列
subset = df[['姓名', '城市']]

# 按条件筛选
young_people = df[df['年龄'] < 30]

# 使用loc和iloc选择数据
print(df.loc[1:3, ['姓名', '城市']])  # 按标签选择
print(df.iloc[1:3, 0:2])  # 按位置选择

4. 数据清洗与处理

# 处理缺失值
df.fillna(0, inplace=True)  # 用0填充缺失值
df.dropna(inplace=True)     # 删除包含缺失值的行
df['年龄'].fillna(df['年龄'].mean(), inplace=True)  # 用平均值填充

# 重命名列
df.rename(columns={'姓名': 'name', '年龄': 'age'}, inplace=True)

# 添加新列
df['收入'] = [5000, 8000, 7000, 9000]
df['税后收入'] = df['收入'] * 0.9  # 直接计算

# 删除列
df.drop('城市', axis=1, inplace=True)

# 数据类型转换
df['年龄'] = df['年龄'].astype('float')
df['入职日期'] = pd.to_datetime(df['入职日期'])

# 去重处理
df.drop_duplicates(subset=['姓名'], keep='first', inplace=True)

5. 数据分组与聚合

# 按城市分组并计算平均年龄
city_avg_age = df.groupby('城市')['年龄'].mean()

# 多条件聚合
agg_results = df.groupby('城市').agg({
    '年龄': ['mean', 'max', 'min', 'count'],
    '收入': ['sum', 'mean', 'std']
})

# 多列分组
grouped = df.groupby(['城市', '年龄段'])['收入'].mean()

# 使用transform保持原始形状
df['城市平均收入'] = df.groupby('城市')['收入'].transform('mean')

6. 数据合并

# 创建第二个DataFrame
data2 = {
    '姓名': ['张三', '李四', '钱七'],
    '部门': ['技术部', '市场部', '财务部'],
    '工号': [1001, 1002, 1003]
}
df2 = pd.DataFrame(data2)

# 合并两个DataFrame
merged_df = pd.merge(df, df2, on='姓名', how='left')

# 其他合并方式
concat_df = pd.concat([df, df2], axis=0)  # 纵向拼接
join_df = df.set_index('姓名').join(df2.set_index('姓名'), how='inner')

7. 时间序列处理

import numpy as np

# 创建时间序列数据
date_rng = pd.date_range(start='2023-01-01', end='2023-01-10', freq='D')
time_series = pd.DataFrame(date_rng, columns=['date'])
time_series['value'] = np.random.randint(0, 100, size=(len(date_rng)))

# 设置日期索引
time_series.set_index('date', inplace=True)

# 按月份重采样
monthly_data = time_series.resample('M').mean()

# 时间偏移
time_series['prev_day'] = time_series['value'].shift(1)

# 滚动窗口计算
time_series['rolling_3d'] = time_series['value'].rolling(window=3).mean()

8. 数据可视化

Pandas内置了基于Matplotlib的简单绘图功能:

import matplotlib.pyplot as plt

# 绘制柱状图
df.plot.bar(x='姓名', y='收入', rot=45, title='员工收入分布')
plt.tight_layout()
plt.show()

# 绘制折线图
time_series.plot(y=['value', 'rolling_3d'], style=['-', '--'], 
                title='时间序列数据')
plt.show()

# 绘制箱线图
df.plot.box(column='收入', by='年龄段')
plt.show()

# 绘制散点图
df.plot.scatter(x='年龄', y='收入', s=100, alpha=0.6)
plt.show()

高级应用示例

1. 数据透视表

# 创建示例数据
sales_data = {
    '日期': pd.date_range('2023-01-01', periods=100),
    '产品': np.random.choice(['A', 'B', 'C'], 100),
    '地区': np.random.choice(['东', '西', '南', '北'], 100),
    '销售额': np.random.randint(100, 1000, 100),
    '成本': np.random.randint(50, 500, 100)
}
sales_df = pd.DataFrame(sales_data)

# 创建数据透视表
pivot_table = pd.pivot_table(sales_df, 
                            values=['销售额', '成本'], 
                            index=['产品', '地区'], 
                            columns=pd.Grouper(key='日期', freq='M'),
                            aggfunc={'销售额': np.sum, '成本': np.mean},
                            margins=True,  # 添加总计
                            fill_value=0)

# 样式设置
styled_pivot = pivot_table.style.format('{:.0f}')\
                                .background_gradient(cmap='Blues')\
                                .highlight_max(color='lightgreen')

2. 多表连接

# 创建三个相关表
orders = pd.DataFrame({
    'order_id': [1, 2, 3, 4],
    'customer_id': [101, 102, 103, 104],
    'order_date': pd.to_datetime(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04'])
})

customers = pd.DataFrame({
    'customer_id': [101, 102, 103, 105],
    'name': ['Alice', 'Bob', 'Charlie', 'David'],
    'email': ['a@example.com', 'b@example.com', 'c@example.com', 'd@example.com']
})

order_items = pd.DataFrame({
    'order_id': [1, 1, 2, 3, 3, 3, 4],
    'product_id': [201, 202, 201, 203, 204, 205, 202],
    'quantity': [1, 2, 1, 3, 1, 2, 1],
    'unit_price': [100, 200, 100, 150, 300, 250, 200]
})

# 多表连接
merged_orders = pd.merge(
    pd.merge(orders, customers, on='customer_id', how='left'),
    order_items, on='order_id', how='left'
)

# 计算总价
merged_orders['total_price'] = merged_orders['quantity'] * merged_orders['unit_price']

# 多层索引
multi_index_df = merged_orders.set_index(['customer_id', 'order_id', 'product_id'])

3. 应用自定义函数

# 定义分类函数
def age_group(age):
    if age < 30:
        return '青年'
    elif age < 50:
        return '中年'
    else:
        return '老年'

# 应用函数创建新列
df['年龄段'] = df['年龄'].apply(age_group)

# 使用lambda函数
df['收入等级'] = df['收入'].apply(lambda x: '高' if x > 8000 else ('中' if x > 6000 else '低'))

# 向量化函数
@np.vectorize
def income_tax(income):
    if income <= 5000:
        return 0
    elif income <= 8000:
        return income * 0.1
    else:
        return income * 0.2

df['所得税'] = income_tax(df['收入'])

# 使用eval高效计算
df.eval('净收入 = 收入 - 所得税', inplace=True)

性能优化技巧

  1. 使用向量化操作:避免循环,使用Pandas内置方法
  2. 选择合适的数据类型:例如将字符串类别转换为category类型
  3. 使用query方法:对于复杂过滤条件
  4. 避免链式索引:使用loc或iloc进行明确索引
  5. 使用高效的数据格式:如parquet或feather
  6. 分块处理大数据:使用chunksize参数
# 优化示例
# 不推荐的方式(慢)
for idx in df.index:
    df.loc[idx, '收入加倍'] = df.loc[idx, '收入'] * 2
    
# 推荐的方式(快)
df['收入加倍'] = df['收入'] * 2

# 使用category类型优化
df['城市'] = df['城市'].astype('category')

# 使用query方法
high_income = df.query('收入 > 8000 and 年龄 < 40')

# 使用eval表达式
df.eval('收入比 = 收入 / 收入.max()', inplace=True)

# 使用高效数据格式
df.to_parquet('data.parquet')  # 比CSV读写更快

结语

Pandas是Python数据分析生态系统的核心组件,掌握它可以极大地提高数据处理效率。本文介绍了从基础到进阶的Pandas用法,包括:

  1. 数据结构与创建方法
  2. 数据读写与清洗技巧
  3. 数据选择与转换操作
  4. 分组聚合与透视分析
  5. 时间序列处理方法
  6. 数据可视化集成
  7. 高级数据操作技巧
  8. 性能优化建议

Pandas的功能远不止于此,还有更多高级特性如:

  • 自定义扩展数据类型
  • 与Dask集成处理大数据
  • 与机器学习库的无缝集成
  • 高级IO功能(读取数据库、网络数据等)

建议在实际项目中多加练习,逐步掌握Pandas的各种高级特性。可以参考官方文档和社区资源继续深入学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值