Pandas 数据分析教程:从入门到精通 – wiki基地

Pandas 数据分析教程:从入门到精通

Pandas 是 Python 中用于数据分析的核心库,它提供了高性能、易于使用的数据结构和数据分析工具,极大地简化了数据清洗、转换、分析和可视化等任务。无论你是数据分析新手还是经验丰富的专家,掌握 Pandas 都是提升工作效率和解决复杂数据问题的关键。本教程将带你从入门到精通 Pandas,涵盖基本概念、常用操作以及高级技巧,助你成为 Pandas 大师。

一、Pandas 基础:Series 和 DataFrame

Pandas 的核心数据结构是 Series 和 DataFrame。理解它们是掌握 Pandas 的第一步。

1. Series:一维标记数组

Series 类似于一维数组,但它带有一个显式的索引 (index)。你可以将 Series 视为带有标签的数组,这些标签允许你更灵活地访问和操作数据。

  • 创建 Series:

“`python
import pandas as pd

从列表创建 Series

data = [10, 20, 30, 40, 50]
s = pd.Series(data)
print(s)

从 NumPy 数组创建 Series

import numpy as np
data = np.array([10, 20, 30, 40, 50])
s = pd.Series(data)
print(s)

从字典创建 Series,字典的键成为索引

data = {‘a’: 10, ‘b’: 20, ‘c’: 30, ‘d’: 40, ‘e’: 50}
s = pd.Series(data)
print(s)

指定索引

s = pd.Series(data, index=[‘e’, ‘d’, ‘c’, ‘b’, ‘a’])
print(s)
“`

  • 访问 Series 数据:

“`python
s = pd.Series([10, 20, 30, 40, 50], index=[‘a’, ‘b’, ‘c’, ‘d’, ‘e’])

使用索引标签访问

print(s[‘a’]) # 输出: 10

使用整数位置访问 (类似列表)

print(s[0]) # 输出: 10

切片操作

print(s[‘a’:’c’]) # 输出:

a 10

b 20

c 30

dtype: int64

print(s[0:3]) # 输出:

a 10

b 20

c 30

dtype: int64

使用布尔索引

print(s[s > 30]) # 输出:

d 40

e 50

dtype: int64

“`

  • Series 常用属性和方法:

  • index: 获取索引

  • values: 获取值(NumPy 数组)
  • dtype: 获取数据类型
  • size: 获取元素个数
  • head(n): 返回前 n 行 (默认 5)
  • tail(n): 返回后 n 行 (默认 5)
  • describe(): 返回描述性统计信息(均值、标准差、最小值、最大值等)
  • value_counts(): 统计不同值的出现次数
  • isnull() / notnull(): 检测缺失值

2. DataFrame:二维表格数据

DataFrame 是 Pandas 的核心数据结构,它是一个二维表格,类似于 Excel 表格或 SQL 表。DataFrame 由多个 Series 组成,每个 Series 代表一列。

  • 创建 DataFrame:

“`python
import pandas as pd

从字典创建 DataFrame

data = {
‘Name’: [‘Alice’, ‘Bob’, ‘Charlie’, ‘David’],
‘Age’: [25, 30, 28, 22],
‘City’: [‘New York’, ‘London’, ‘Paris’, ‘Tokyo’]
}
df = pd.DataFrame(data)
print(df)

从列表的列表创建 DataFrame

data = [
[‘Alice’, 25, ‘New York’],
[‘Bob’, 30, ‘London’],
[‘Charlie’, 28, ‘Paris’],
[‘David’, 22, ‘Tokyo’]
]
df = pd.DataFrame(data, columns=[‘Name’, ‘Age’, ‘City’])
print(df)

从 NumPy 数组创建 DataFrame

import numpy as np
data = np.array([
[‘Alice’, 25, ‘New York’],
[‘Bob’, 30, ‘London’],
[‘Charlie’, 28, ‘Paris’],
[‘David’, 22, ‘Tokyo’]
])
df = pd.DataFrame(data, columns=[‘Name’, ‘Age’, ‘City’])
print(df)
“`

  • 访问 DataFrame 数据:

“`python
data = {
‘Name’: [‘Alice’, ‘Bob’, ‘Charlie’, ‘David’],
‘Age’: [25, 30, 28, 22],
‘City’: [‘New York’, ‘London’, ‘Paris’, ‘Tokyo’]
}
df = pd.DataFrame(data)

选择一列

print(df[‘Name’]) # 输出 Series

选择多列

print(df[[‘Name’, ‘Age’]]) # 输出 DataFrame

选择一行 (使用 loc)

print(df.loc[0]) # 输出 Series,索引为列名

选择一行 (使用 iloc)

print(df.iloc[0]) # 输出 Series,索引为列名,基于整数位置

选择特定行和列 (loc 基于标签,iloc 基于整数位置)

print(df.loc[0, ‘Name’]) # 输出: Alice
print(df.iloc[0, 0]) # 输出: Alice

使用条件选择行

print(df[df[‘Age’] > 25])
“`

  • DataFrame 常用属性和方法:

  • index: 获取行索引

  • columns: 获取列索引
  • values: 获取值(NumPy 数组)
  • shape: 获取 DataFrame 的形状 (行数, 列数)
  • dtypes: 获取每列的数据类型
  • head(n): 返回前 n 行 (默认 5)
  • tail(n): 返回后 n 行 (默认 5)
  • info(): 显示 DataFrame 的简要信息(行数、列数、数据类型、缺失值等)
  • describe(): 返回每列的描述性统计信息
  • isnull() / notnull(): 检测缺失值
  • dropna(): 删除包含缺失值的行或列
  • fillna(): 填充缺失值
  • sort_values(): 按列排序
  • groupby(): 分组操作
  • apply(): 对行或列应用函数
  • merge(): 合并 DataFrame
  • concat(): 连接 DataFrame
  • pivot_table(): 创建透视表
  • to_csv(): 保存到 CSV 文件
  • read_csv(): 从 CSV 文件读取

二、数据清洗和转换

真实世界的数据往往是不干净的,包含缺失值、重复值、错误格式等。数据清洗是数据分析的关键步骤,Pandas 提供了强大的工具来处理这些问题。

  • 处理缺失值:

“`python
import pandas as pd
import numpy as np

data = {‘A’: [1, 2, np.nan, 4, 5], ‘B’: [np.nan, 6, 7, 8, np.nan]}
df = pd.DataFrame(data)

检测缺失值

print(df.isnull())
print(df.notnull())

删除包含缺失值的行或列

df_dropna_row = df.dropna() # 删除包含任何缺失值的行
df_dropna_col = df.dropna(axis=1) # 删除包含任何缺失值的列

填充缺失值

df_fillna_0 = df.fillna(0) # 用 0 填充
df_fillna_mean = df.fillna(df.mean()) # 用每列的均值填充
df_fillna_ffill = df.fillna(method=’ffill’) # 用前一个有效值填充 (向前填充)
df_fillna_bfill = df.fillna(method=’bfill’) # 用后一个有效值填充 (向后填充)
“`

  • 处理重复值:

“`python
import pandas as pd

data = {‘A’: [1, 2, 2, 3, 3], ‘B’: [4, 5, 5, 6, 6]}
df = pd.DataFrame(data)

检测重复值

print(df.duplicated())

删除重复值

df_drop_duplicates = df.drop_duplicates()
“`

  • 数据类型转换:

“`python
import pandas as pd

data = {‘A’: [‘1’, ‘2’, ‘3’], ‘B’: [‘4.5’, ‘5.6’, ‘6.7’]}
df = pd.DataFrame(data)

转换数据类型

df[‘A’] = df[‘A’].astype(int)
df[‘B’] = df[‘B’].astype(float)
“`

  • 字符串操作:

“`python
import pandas as pd

data = {‘Name’: [‘Alice Smith’, ‘Bob Johnson’, ‘Charlie Brown’]}
df = pd.DataFrame(data)

字符串操作

df[‘FirstName’] = df[‘Name’].str.split(‘ ‘).str[0] # 提取名字
df[‘LastName’] = df[‘Name’].str.split(‘ ‘).str[1] # 提取姓氏
df[‘Name_Length’] = df[‘Name’].str.len() # 计算字符串长度
df[‘Name_Upper’] = df[‘Name’].str.upper() # 转换为大写
“`

三、数据分析和聚合

Pandas 提供了强大的数据分析和聚合功能,可以让你轻松地从数据中提取有用的信息。

  • 分组 (groupby):

“`python
import pandas as pd

data = {
‘Category’: [‘A’, ‘A’, ‘B’, ‘B’, ‘C’, ‘C’],
‘Value’: [10, 15, 20, 25, 30, 35]
}
df = pd.DataFrame(data)

分组

grouped = df.groupby(‘Category’)

聚合

print(grouped.sum()) # 求和
print(grouped.mean()) # 求均值
print(grouped.count()) # 计数
print(grouped.max()) # 求最大值
print(grouped.min()) # 求最小值

应用自定义函数

def custom_function(x):
return x.max() – x.min()

print(grouped.agg(custom_function))

多重聚合

print(grouped.agg([‘sum’, ‘mean’, ‘max’]))
“`

  • 透视表 (pivot_table):

“`python
import pandas as pd

data = {
‘Date’: [‘2023-01-01’, ‘2023-01-01’, ‘2023-01-02’, ‘2023-01-02’],
‘Category’: [‘A’, ‘B’, ‘A’, ‘B’],
‘Value’: [10, 20, 15, 25]
}
df = pd.DataFrame(data)

创建透视表

pivot_table = pd.pivot_table(df, values=’Value’, index=’Date’, columns=’Category’)
print(pivot_table)
“`

  • 合并 (merge) 和连接 (concat):

“`python
import pandas as pd

df1 = pd.DataFrame({‘A’: [1, 2, 3], ‘B’: [4, 5, 6]})
df2 = pd.DataFrame({‘A’: [1, 2, 4], ‘C’: [7, 8, 9]})

合并 (类似 SQL JOIN)

merged_df = pd.merge(df1, df2, on=’A’, how=’inner’) # 内连接
print(merged_df)

连接 (沿轴向堆叠)

concatenated_df = pd.concat([df1, df2], axis=0) # 沿行连接
print(concatenated_df)
“`

四、时间序列分析

Pandas 对时间序列数据提供了强大的支持,可以轻松地处理日期和时间相关的数据。

  • 创建时间序列:

“`python
import pandas as pd

创建日期范围

dates = pd.date_range(‘2023-01-01′, periods=10, freq=’D’) # 每天
print(dates)

将字符串转换为日期时间类型

date_strings = [‘2023-01-01’, ‘2023-01-02’, ‘2023-01-03’]
dates = pd.to_datetime(date_strings)
print(dates)
“`

  • 时间序列操作:

“`python
import pandas as pd

dates = pd.date_range(‘2023-01-01′, periods=10, freq=’D’)
df = pd.DataFrame({‘Date’: dates, ‘Value’: range(10)})
df.set_index(‘Date’, inplace=True)

重采样

print(df.resample(‘W’).sum()) # 按周重采样并求和

时区转换

(需要安装 pytz: pip install pytz)

import pytz

df.index = df.index.tz_localize(‘UTC’)

df.index = df.index.tz_convert(‘America/New_York’)

时间序列分解 (需要安装 statsmodels: pip install statsmodels)

from statsmodels.tsa.seasonal import seasonal_decompose

decomposition = seasonal_decompose(df[‘Value’], model=’additive’, period=1)

decomposition.plot()

“`

五、高级技巧和最佳实践

  • 链式操作: 使用链式操作可以提高代码的可读性和效率。

python
df = (pd.read_csv('data.csv')
.dropna()
.rename(columns={'old_name': 'new_name'})
.groupby('Category')['Value'].sum()
.reset_index())

  • 使用 apply 函数: apply 函数可以对行或列应用自定义函数,但要注意性能问题,尽量使用 Pandas 内置的函数。

  • 矢量化操作: Pandas 的矢量化操作利用 NumPy 的底层实现,可以大幅提高数据处理速度。尽量避免使用循环,而使用矢量化操作。

  • 内存优化: 对于大型数据集,可以考虑使用更小的数据类型 (如 int8float32),或者使用 chunksize 参数分块读取数据。

  • 使用 query 方法: query 方法可以更简洁地进行条件筛选。

python
df.query('Age > 25 and City == "London"')

  • 了解 Pandas 的版本更新: Pandas 在不断更新,新版本通常会带来性能改进和新功能。及时了解版本更新可以让你更好地利用 Pandas。

六、总结

本教程涵盖了 Pandas 的基础知识、数据清洗、数据分析和时间序列分析。掌握这些知识,你就可以使用 Pandas 解决各种数据分析问题。记住,实践是最好的老师。尝试用 Pandas 处理真实世界的数据集,并不断探索 Pandas 的更多功能,你将会成为一名 Pandas 大师! 持续学习和实践是掌握 Pandas 的关键。 祝你学习愉快!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部