Polars简明基础教程七:Series 和 DataFrame 以及它们之间的转换_A

在听完这次讲座之后,您将能够:

  • 初步认识 Series 和 DataFrame 的一些特性。
  • 在 Series 和 DataFrame 列之间进行转换。
  • 在 Python 的 lists(列表)、dicts(字典)与 Series 和 DataFrames 之间来回转换。

Series

在 Polars 中,Series 是一个非常重要的数据结构,它类似于 NumPy 的数组或 Pandas 的 Series。Series 代表一维的数据,可以包含各种数据类型,如整数、浮点数、字符串等。它在 Polars 中扮演着关键角色,因为 DataFrame 本质上是由多个 Series 组成的。

Series的创建

Series 可以通过多种方式创建,例如从列表、NumPy 数组、Pandas Series 或 Polars Dataframe 创建。以下是一些创建 Series 的示例:

从列表创建Series:

import polars as pl

# 从列表创建 Series
s1 = pl.Series([1, 2, 3, 4, 5])
print(s1)

从 Numpy 数组创建 Series:

# 从 NumPy 数组创建 Series
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
s2 = pl.Series(arr)
print(s2)

从 Pandas Series 创建 Series:

# 从 Pandas Series 创建 Series
import pandas as pd
pd_series = pd.Series([1, 2, 3, 4, 5])
s3 = pl.from_pandas(pd_series)
print(s3)

 Series的数据类型

 Polars 的 Series 支持多种数据类型,这些数据类型可以大致分为基本类型和复合类型。

基本数据类型

基本数据类型通常包括数字类型(整数、浮点)、布尔类型和字符串类型。

  • 整数类型:

    • Int8: 8 位带符号整数。
    • Int16: 16 位带符号整数。
    • Int32: 32 位带符号整数。
    • Int64: 64 位带符号整数。
    • UInt8: 8 位无符号整数。
    • UInt16: 16 位无符号整数。
    • UInt32: 32 位无符号整数。
    • UInt64: 64 位无符号整数。
  • 浮点类型:

    • Float32: 32 位浮点数。
    • Float64: 64 位浮点数。
  • 布尔类型:

    • Boolean: 布尔值类型,只能取 True 或 False
  • 字符串类型:

    • Utf8: UTF-8 编码的字符串。

复合类型

  • 列表类型:

    • List: 列表类型可以包含任意类型的元素。例如,List[Int64] 表示一个列表,其中的元素都是 Int64 类型。
  • 结构体类型:

    • Struct: 结构体类型可以包含多个字段,每个字段可以有不同的数据类型。例如,Struct[{"field1": Int64, "field2": Utf8}] 表示一个结构体,其中有两个字段:field1 为 Int64 类型,field2 为 Utf8 类型。
  • 日期时间类型:

    • Datetime: 日期时间类型,可以指定时间单位和时区。例如,Datetime("ns") 表示纳秒精度的日期时间类型,Datetime("ms", "UTC") 表示毫秒精度且时区为 UTC 的日期时间类型。
  • 日期类型:

    • Date: 日期类型,表示没有时间部分的日期。
  • 时间类型:

    • Time: 时间类型,表示没有日期部分的时间。
  • 持续时间类型:

    • Duration: 持续时间类型,可以指定时间单位。例如,Duration("ns") 表示纳秒精度的持续时间类型。
  • 类别类型:

    • Categorical: 类别类型,用于存储有限数量的类别。这在处理分类数据时非常有用。
  • 对象类型:

    • Object: 对象类型,用于存储任何 Python 对象。

 Series索引

Series 的索引指的是用于定位 Series 中元素的位置标识。Polars 的 Series 默认使用整数索引,这意味着索引是从 0 开始递增的。除了默认的整数索引外,Polars 还支持使用自定义索引,这在某些情况下非常有用。

默认整数索引

默认情况下,Polars 的 Series 使用整数索引。当你创建一个 Series 时,Polars 会自动为每个元素分配一个整数索引,索引从 0 开始递增。

import polars as pl

# 创建一个 Series
s = pl.Series([1, 2, 3, 4, 5])

# 显示 Series
print(s)

# 输出:
# shape: (5,)
# Series: '' [i64]
# [
#     1
#     2
#     3
#     4
#     5
# ]

使用索引访问元素

你可以使用索引来访问 Series 中的单个元素或一组元素。

使用索引来获取单个元素:

# 获取第一个元素
first_element = s[0]
print(first_element)  # 输出: 1

# 获取最后一个元素
last_element = s[-1]
print(last_element)  # 输出: 5

使用切片来获取一组元素:

# 获取第 2 到第 4 个元素
slice_elements = s[1:4]
print(slice_elements)  # 输出: shape: (3,)
                      #        Series: '' [i64]
                      #        [
                      #            2
                      #            3
                      #            4
                      #        ]

自定义索引

除了默认的整数索引外,Polars 还支持使用自定义索引。自定义索引可以是任何可以排序的类型,如字符串、日期等。当你使用自定义索引时,你可以通过这些索引来访问 Series 中的元素。这在某些场景下非常有用,例如当你的数据具有特定的标签或日期作为索引时。

另外,使用自定义索引时需要注意索引的唯一性和可排序性。

创建一个带有自定义索引的 Series

# 创建一个带有自定义索引的 Series
index_values = ["a", "b", "c", "d", "e"]
data = [1, 2, 3, 4, 5]
s_custom_index = pl.Series(index=index_values, values=data)

# 显示 Series
print(s_custom_index)

# 输出:
# shape: (5,)
# Series: '' [i64]
# [
#     1
#     2
#     3
#     4
#     5
# ]

使用自定义索引来访问元素:

# 使用自定义索引访问元素
element_b = s_custom_index["b"]
print(element_b)  # 输出: 2

# 使用切片获取多个元素
elements_slice = s_custom_index["b":"d"]
print(elements_slice)  # 输出: shape: (3,)
                      #        Series: '' [i64]
                      #        [
                      #            2
                      #            3
                      #            4
                      #        ]

 Series的长度

Series 的长度是指 Series 中元素的数量。长度是一个重要的属性,可以帮助你了解 Series 的大小。

获取长度

你可以使用 len() 函数或 .len() 方法来获取 Series 的长度。

创建一个 Series 并获取其长度:

import polars as pl

# 创建一个 Series
s = pl.Series([1, 2, 3, 4, 5])

# 获取 Series 的长度
length = len(s)
print(length)  # 输出: 5

# 或者使用 .len() 方法
length_method = s.len()
print(length_method)  # 输出: 5

使用长度

Series 的长度在许多场景中都非常有用,例如:

  • 循环遍历:

    当你需要遍历 Series 中的所有元素时,长度可以帮助你确定循环次数。
  • 数据验证:

    你可以使用长度来验证数据集的大小是否符合预期。
  • 子集选择:

    你可以基于长度来选择 Series 的子集,例如选择前 N 个元素。
  • 条件判断:

    在处理数据时,长度可以用来决定是否继续处理数据或采取不同的处理路径。

 选择元素

在 Polars 中,Series 提供了多种方法来获取元素。这些方法可以帮助你访问 Series 中的单个元素或一系列元素。下面是几种常用的获取元素的方法。

1. 使用索引获取单个元素

你可以使用索引来获取 Series 中的单个元素。默认情况下,Series 使用整数索引,索引从 0 开始。

import polars as pl

# 创建一个 Series
s = pl.Series([1, 2, 3, 4, 5])

# 获取第一个元素
first_element = s[0]
print(first_element)  # 输出: 1

# 获取最后一个元素
last_element = s[-1]
print(last_element)  # 输出: 5

2. 使用切片获取多个元素

你可以使用切片来获取 Series 中的一系列元素。切片语法与 Python 的列表切片语法相似。

# 获取第 2 到第 4 个元素
slice_elements = s[1:4]
print(slice_elements)  # 输出: shape: (3,)
                      #        Series: '' [i64]
                      #        [
                      #            2
                      #            3
                      #            4
                      #        ]

3. 使用条件表达式获取元素

你可以使用条件表达式来选择满足条件的元素。这通常涉及到 Series 的方法和操作符。

# 获取大于 2 的元素
filtered_elements = s[s > 2]
print(filtered_elements)  # 输出: shape: (3,)
                        #        Series: '' [i64]
                        #        [
                        #            3
                        #            4
                        #            5
                        #        ]

4. 使用 .take 方法获取指定位置的元素

.take 方法允许你通过提供索引列表来获取 Series 中指定位置的元素。

# 获取索引为 0 和 2 的元素
selected_elements = s.take([0, 2])
print(selected_elements)  # 输出: shape: (2,)
                        #        Series: '' [i64]
                        #        [
                        #            1
                        #            3
                        #        ]

5. 使用 .first 和 .last 方法获取第一个和最后一个元素

.first.last 方法可以用来快速获取 Series 的第一个和最后一个元素。

# 获取第一个元素
first_element = s.first()
print(first_element)  # 输出: 1

# 获取最后一个元素
last_element = s.last()
print(last_element)  # 输出: 5

 切片

在 Polars 中,Series 的切片语法与 Python 的列表切片语法相似。切片的基本语法如下:

 s[start:stop:step]: 从 start 索引开始,到 stop 索引结束(不包括 stop 索引),每隔 step 个元素选择一个元素。如果省略 startstop,则默认值分别是 0Series 的长度。如果省略 step,则默认值为 1

import polars as pl

# 创建一个 Series
s = pl.Series([1, 2, 3, 4, 5])

# 获取第 2 到第 4 个元素
slice_elements = s[1:4]
print(slice_elements)  # 输出: shape: (3,)
                      #        Series: '' [i64]
                      #        [
                      #            2
                      #            3
                      #            4
                      #        ]

# 获取前 3 个元素
first_three_elements = s[:3]
print(first_three_elements)  # 输出: shape: (3,)
                             #        Series: '' [i64]
                             #        [
                             #            1
                             #            2
                             #            3
                             #        ]

# 获取后 2 个元素
last_two_elements = s[-2:]
print(last_two_elements)  # 输出: shape: (2,)
                         #        Series: '' [i64]
                         #        [
                         #            4
                         #            5
                         #        ]

# 每隔一个元素选择
every_other_element = s[::2]
print(every_other_element)  # 输出: shape: (3,)
                            #        Series: '' [i64]
                            #        [
                            #            1
                            #            3
                            #            5
                            #        ]

# 逆序选择
reversed_elements = s[::-1]
print(reversed_elements)  # 输出: shape: (5,)
                          #        Series: '' [i64]
                          #        [
                          #            5
                          #            4
                          #            3
                          #            2
                          #            1
                          #        ]

注意事项

  • 切片操作不会修改原始 Series
  • 切片操作返回一个新的 Series,包含选择的元素。
  • 如果 step 为负数,则会从后向前选择元素。

使用条件表达式切片

除了基于索引位置进行切片外,你还可以使用条件表达式来选择满足特定条件的元素。

选择大于 2 的元素:

# 选择大于 2 的元素
filtered_elements = s[s > 2]
print(filtered_elements)  # 输出: shape: (3,)
                        #        Series: '' [i64]
                        #        [
                        #            3
                        #            4
                        #            5
                        #        ]

 方法和操作

 Series 提供了许多内置的方法,如 sum()mean()max()min()sort()reverse()unique()cumsum()shift()fillna()drop_nulls()apply() 等

# 计算最大值
max_value = s.max()
print(max_value)  # 输出: 5

# 计算平均值
mean_value = s.mean()
print(mean_value)  # 输出: 3.0

# 累加和
cumulative_sum = s.cumsum()
print(cumulative_sum)  # 输出: shape: (5,)
                      #        Series: '' [i64]
                      #        [
                      #            1
                      #            3
                      #            6
                      #            10
                      #            15
                      #        ]

# 填充缺失值
s_with_null = pl.Series([1, None, 3, 4, 5])
filled_s = s_with_null.fill_null(0)
print(filled_s)  # 输出: shape: (5,)
                #        Series: '' [i64]
                #        [
                #            1
                #            0
                #            3
                #            4
                #            5
                #        ]

 算术运算

 Series 支持算术运算,如加法 +, 减法 -, 乘法 *, 除法 / 等

# 创建另一个 Series
s2 = pl.Series([10, 20, 30, 40, 50])

# 加法
s_sum = s + s2
print(s_sum)  # 输出: shape: (5,)
              #        Series: '' [i64]
              #        [
              #            11
              #            22
              #            33
              #            44
              #            55
              #        ]

# 乘法
s_multiply = s * 2
print(s_multiply)  # 输出: shape: (5,)
                  #        Series: '' [i64]
                  #        [
                  #            2
                  #            4
                  #            6
                  #            8
                  #            10
                  #        ]

Polars简明基础教程系列

Polars简明基础教程一:Polars快速入门

Polars简明基础教程二:懒惰模式 1:引入懒惰模式

Polars简明基础教程三:懒惰模式 1:引入懒惰模式(续)

Polars简明基础教程四:懒惰模式 2:评估查询

Polars简明基础教程五:什么是Polars的“DataFrame(数据框)_上”

Polars简明基础教程六:什么是Polars的“DataFrame(数据框)_下”

Polars简明基础教程七:Series 和 DataFrame 以及它们之间的转换_A

Polars简明基础教程八:Series 和 DataFrame 以及它们之间的转换_B

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
polars是一个基于Rust语言的数据处理库,它提供了类似于pandas的数据操作功能。下面是polars使用教程的简要介绍: 1. 安装polars: 首先,你需要在你的项目中添加polars作为依赖项。可以通过在Cargo.toml文件中添加以下行来实现: ``` [dependencies] polars = "0.16" ``` 2. 导入polars: 在你的Rust代码中,使用`use`关键字导入polars库: ```rust use polars::prelude::*; ``` 3. 创建DataFrame: 使用`DataFrame`结构来表示数据集。你可以从不同的数据源创建DataFrame,例如CSV文件、内存中的数据等。以下是从CSV文件创建DataFrame的示例: ```rust let df = CsvReader::from_path("data.csv") .unwrap() .infer_schema(None) .unwrap() .has_header(true) .finish() .unwrap(); ``` 4. 数据操作: polars提供了丰富的数据操作功能,包括选择列、过滤行、排序、聚合等。以下是一些常见的数据操作示例: - 选择列: ```rust let selected_df = df.select(&["column1", "column2"]); ``` - 过滤行: ```rust let filtered_df = df.filter(col("column1").gt(lit(10))); ``` - 排序: ```rust let sorted_df = df.sort("column1", false); ``` - 聚合: ```rust let aggregated_df = df.groupby("column1").agg(&[col("column2").sum(), col("column3").mean()]); ``` 5. 数据输出: polars支持将DataFrame导出为不同的数据格式,例如CSV、Parquet等。以下是将DataFrame导出为CSV文件的示例: ```rust df.write_csv("output.csv").unwrap(); ``` 这只是polars的一小部分功能介绍,你可以查阅polars的官方文档以获取更详细的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值