Python Pandas 中的数据结构详解

yizhihongxing

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 行

数据清洗

在开始数据分析之前,我们需要对数据进行清洗和预处理。具体来说,我们需要完成以下任务:

  1. 将日期列转换为 Pandas 中的 Datetime 类型。
  2. 删除缺失数据。
  3. 添加新列(收益率、涨跌)。

首先,我们将日期列转换为 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)  # 删除包含缺失数据的行

数据分析

有了清洗后的数据,我们可以开始进行数据分析了。根据需求,我们可以分析出以下几个指标:

  1. 每年股票价格的平均值、最大值、最小值和标准差。
  2. 每周股票收盘价涨跌情况的统计。

按年统计

为了按年统计股票价格指标,我们可以使用 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技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • python 使用pandas计算累积求和的方法

    当我们需要对一个数据集进行累计求和操作时,可以使用pandas的cumsum()方法,该方法可以将数据集中的每一个值依次累加起来并返回一个新的序列。 以下是使用pandas计算累加和的完整攻略: 确定数据源 首先要确定我们要对哪些数据进行累计求和,可以使用Numpy或读取csv文件等方式获取数据。 例如,我们想要求累计某一列数据的和,可以先使用pandas读…

    python 2023年5月14日
    00
  • Pandas分组聚合之groupby()、agg()方法的使用教程

    一、Pandas分组聚合之groupby()方法的使用教程1. groupby()方法的基本语法及功能groupby()方法是Pandas中非常强大的分组聚合工具,其基本语法格式为:DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True,…

    python 2023年5月14日
    00
  • python 利用panda 实现列联表(交叉表)

    下面我为您详细讲解“python利用panda实现列联表(交叉表)”的完整攻略。 1. pandas中列联表的概念 列联表是一种将两个或多个分类变量交叉分类后形成的表格,用于展示它们之间的关系。pandas中列联表的实现就是通过数据透视表来实现的,它可以将一张表中的一些列作为纵坐标,将另外一些列作为横坐标,将数据值作为交叉点所显示的值,从而实现对某些分类变量…

    python 2023年5月14日
    00
  • Pandas中的布尔索引

    Pandas中的布尔索引是一种通过布尔值来筛选数据的方法。布尔索引可以使用一个布尔值数组,它的长度必须与要筛选的轴(axis)长度一致,以此来选择DataFrame或Series中符合某些条件的行或列。接下来,我们将详细介绍Pandas中使用布尔索引的完整攻略,包括使用布尔索引来过滤数据的步骤,并使用实例进一步说明。 步骤 使用布尔索引来过滤数据,需要遵循以…

    python-answer 2023年3月27日
    00
  • Python数据分析Pandas Dataframe排序操作

    下面是关于“Python数据分析Pandas Dataframe排序操作”的完整攻略。 一、Pandas Dataframe排序操作 Pandas是基于Numpy开发的数据分析工具,最重要的两个数据结构是Series和DataFrame,其他的几乎都是在这两个数据结构的基础上进行扩展的。 Pandas Dataframe排序操作是数据分析中常用的操作之一,常…

    python 2023年5月14日
    00
  • Python Pandas处理CSV文件的常用技巧分享

    Python Pandas处理CSV文件的常用技巧分享 CSV(Comma Separated Value)文件是一种常见的数据存储格式,可以使用Python Pandas库来读取、分析和处理CSV文件。以下是一些常用的技巧: 读取CSV文件 要读取CSV文件,可以使用Pandas的read_csv()函数。 import pandas as pd df =…

    python 2023年5月14日
    00
  • 如何在Pandas数据框架中小写列名

    在Pandas数据框架中,小写列名可以加强统一性和可读性,下面是小写列名的详细攻略及实例说明。 步骤一:获取要小写的列名 首先,我们需要获取要小写的列名,如果数据框中的列名比较多,手动一个一个修改非常麻烦,可以通过如下代码获取全部列名: lower_cols = list(df.columns) 步骤二:使用列表解析式转换列名为小写 利用列表解析式,我们可以…

    python-answer 2023年3月27日
    00
  • 使用Python进行RFM分析

    RFM分析指的是根据用户的最近一次购买时间、购买频率以及平均消费金额等因素来对用户进行分群和分析的一种方法。Python是一种非常适合进行RFM分析的语言,因为Python的数据分析工具和机器学习工具非常强大且易于使用。下面将详细讲解如何使用Python进行RFM分析。 1. 数据准备 RFM分析需要的数据通常包括每个用户的购买时间、购买金额以及订单号等信息…

    python-answer 2023年3月27日
    00
合作推广
合作推广
分享本页
返回顶部