Python Pandas 中的数据结构详解
什么是 Pandas
Pandas 是一个强大、灵活、高效的数据分析工具,尤其是在处理大型数据集时,Pandas 的表现十分出色。它主要用于处理带标签的数组(Series)和表格(DataFrame)数据,完美地结合了 NumPy 和 SQL 功能,为数据分析提供了诸多易用的函数和方法。
Pandas 中的两种主要数据结构
Series
Series 是一个类似于数组的一维数据结构,由一组数据和与之相关的标签(即索引)组成。与 Python 中的列表、元组等容器不同,Series 可以存储任意数据类型,包括整数、浮点数、字符串和对象等。
创建 Series
我们可以通过多种方式创建 Series,例如使用 Python 列表、字典等。
import pandas as pd
# 用列表创建 Series
s1 = pd.Series([1, 3, 5, 7])
print(s1)
# 用字典创建 Series
s2 = pd.Series({'a': 1, 'b': 3, 'c': 5, 'd': 7})
print(s2)
DataFrame
DataFrame 是一个二维表格数据结构,由多个带标签的列构成,每一列可以包含不同的数据类型。类似于关系型数据库中的表格,DataFrame 可以对数据进行增、删、改、查等操作。
创建 DataFrame
我们可以通过多种方式创建 DataFrame,例如使用 Python 字典、列表等。
# 用字典创建 DataFrame
df1 = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35], 'City': ['Beijing', 'Shanghai', 'Guangzhou']})
print(df1)
# 用列表创建 DataFrame
data = [['Alice', 25, 'Beijing'], ['Bob', 30, 'Shanghai'], ['Charlie', 35, 'Guangzhou']]
columns = ['Name', 'Age', 'City']
df2 = pd.DataFrame(data, columns=columns)
print(df2)
索引和切片
Pandas 中的索引和切片操作与 Python 原生的列表、字典等容器类似,但有些许不同,需要注意。
Series 索引和切片
索引
我们可以使用整数或标签索引 Series,也可以使用切片索引,但需要注意末尾元素是否包含在内。
s = pd.Series([1, 3, 5, 7, 9], index=['a', 'b', 'c', 'd', 'e'])
# 整数索引
print(s[0])
# 标签索引
print(s['b'])
# 切片索引
print(s[1:4]) # 左闭右开,不包含 'd'
切片
对于 Series,切片索引的结果仍然是一个 Series,而非单个元素,因此需要注意返回值的类型。
s = pd.Series([1, 3, 5, 7, 9], index=['a', 'b', 'c', 'd', 'e'])
# 整数切片
print(s[1:4]) # 返回一个中间部分的 Series
# 标签切片
print(s['b':'d']) # 返回一个标签范围内的 Series(包含末尾元素)
DataFrame 索引和切片
索引
我们可以使用整数或标签索引 DataFrame,分别对应行和列的索引。需要注意的是,使用整数索引时,默认按行进行索引。
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35], 'City': ['Beijing', 'Shanghai', 'Guangzhou']})
# 按列名索引
print(df['Name'])
# 按行索引
print(df.loc[0]) # 使用 loc 按标签索引行
print(df.iloc[0]) # 使用 iloc 按整数索引行
切片
对于 DataFrame,我们可以使用 loc 和 iloc 实现不同的切片功能。需要注意的是,loc 切片时,切片左右都包含在内,而 iloc 则右侧不包含。
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35], 'City': ['Beijing', 'Shanghai', 'Guangzhou']})
# 按行切片(loc)
print(df.loc[0:1]) # 左右都包含
# 按行切片(iloc)
print(df.iloc[0:2]) # 左包含,右不包含
# 按列切片
print(df.loc[:, 'Name':'Age']) # 指定列名范围
示例:对股票数据的处理
为了演示 Pandas 的强大功能,我们以股票数据为例,对其进行处理。
数据准备
我们从 Yahoo Finance 上下载 AAPL(苹果公司) 的历史数据,并保存为 CSV 文件。数据包含日期、开盘价、最高价、最低价、收盘价和成交量等信息。
读取数据
我们使用 Pandas 的 read_csv 函数读取 CSV 文件,并将日期列作为索引。
import pandas as pd
df = pd.read_csv('AAPL.csv', index_col='Date')
print(df.head()) # 查看前 5 行
数据清洗
在开始数据分析之前,我们需要对数据进行清洗和预处理。具体来说,我们需要完成以下任务:
- 将日期列转换为 Pandas 中的 Datetime 类型。
- 删除缺失数据。
- 添加新列(收益率、涨跌)。
首先,我们将日期列转换为 Pandas 中的 Datetime 类型,并按日期进行排序。
df.index = pd.to_datetime(df.index) # 将日期列转换为 Datetime 类型
df.sort_index(inplace=True) # 按索引排序
其次,我们删除缺失数据,对于缺失的数据,我们可以使用一些方法进行填充,例如使用上一条数据进行填充(ffill)、使用均值进行填充等。这里我们选择直接删除缺失数据,以保证数据的准确性。
df.dropna(inplace=True) # 删除缺失数据
最后,我们添加两列新数据:收益率(Return)和涨跌(Change)。其中,收益率表示当天收盘价与前一天收盘价之间的变化率,涨跌表示收益率的正负。
df['Return'] = (df['Close'] - df['Close'].shift(1)) / df['Close'].shift(1) * 100 # 计算收益率
df['Change'] = df['Return'].apply(lambda x: '涨' if x >= 0 else '跌') # 计算涨跌
df.dropna(inplace=True) # 删除包含缺失数据的行
数据分析
有了清洗后的数据,我们可以开始进行数据分析了。根据需求,我们可以分析出以下几个指标:
- 每年股票价格的平均值、最大值、最小值和标准差。
- 每周股票收盘价涨跌情况的统计。
按年统计
为了按年统计股票价格指标,我们可以使用 Pandas 的 groupby 方法,将数据按年分组,然后分别计算每年的平均值、最大值、最小值和标准差。
yearly = df.groupby(df.index.year).agg({'High': 'max', 'Low': 'min', 'Close': ['mean', 'std']})
yearly.columns = ['High_Max', 'Low_Min', 'Close_Mean', 'Close_Std'] # 修改多重列索引名称
print(yearly)
按周统计
为了按周统计股票收盘价涨跌情况,我们可以使用 Pandas 的 resample 方法,将数据按周进行重采样,然后使用 value_counts 方法统计涨跌情况。
weekly = df.resample('W').last()['Change'] # 重采样为周,保留最后一天的收盘价
weekly_count = weekly.value_counts() # 统计涨跌次数
print(weekly_count)
总结
Pandas 是一个强大、灵活、高效的数据分析工具,它提供了多种数据结构和函数,使得数据分析变得更加简单、快速、方便。本文介绍了 Pandas 中的两种主要数据结构:Series 和 DataFrame,以及索引和切片、数据清洗、数据分析等方面的知识。通过实例的介绍,我们可以更好地理解 Pandas 的用法和优势,为日后的数据分析工作奠定基础。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python Pandas 中的数据结构详解 - Python技术站