Python – 创建 Pandas 数组以存储区间数据

Python – 创建 Pandas 数组以存储区间数据

在数据分析和机器学习领域,经常需要对连续范围的数据进行处理,例如划分为不同的桶或区间。Pandas 是 Python 中一个重要的数据分析库,它提供了 DataFrame 和 Series 两个基本的数据结构。在 Pandas 中创建一个区间数组,可以轻松地划分和处理连续的数值范围。

Pandas 中的区间数据类型

Pandas 中的区间数据类型可以通过 pd.Interval 类来表示。该类的实例需要两个参数:左端点和右端点,来划定一个区间。例如,创建一个区间 [0, 1):

import pandas as pd

interval = pd.Interval(left=0, right=1, closed='left')
print(interval)
# 输出:[0, 1)

此外,pd.Interval 还支持许多有用的操作,例如比较、交集、并集等。例如,下面的代码比较两个区间是否相交:

interval1 = pd.Interval(1, 3)
interval2 = pd.Interval(2, 4)
print(interval1.overlaps(interval2))
# 输出:True

Pandas 还提供了 pd.IntervalIndex 类,可以用于存储和处理一组区间。例如,创建一个固定数量的等距区间:

index = pd.IntervalIndex.from_breaks([0, 1, 2, 3, 4])
print(index)
# 输出:IntervalIndex([(0, 1], (1, 2], (2, 3], (3, 4]]
#               closed='right',
#               dtype='interval[int64]')

创建一维的区间数组

创建一维的区间数组,可以使用 pd.interval_range() 函数。该函数接受三个必须的参数:区间的左端点、右端点和区间的长度。例如,创建一个左闭右开的等距区间:

import pandas as pd

arr = pd.interval_range(start=0, end=10, periods=5, closed='left')
print(arr)
# 输出:IntervalIndex([[0, 2), [2, 4), [4, 6), [6, 8), [8, 10)),
#               closed='left',
#               dtype='interval[float64]')

上面的代码将 [0, 10) 分为了 5 个长度相等的区间,每个区间长度为 2。另外,closed 参数用于指定区间的开闭状态,包括 'left''right''both''neither',默认为 'right'

创建二维的区间数组

创建二维的区间数组,可以使用 pd.IntervalIndex.from_arrays() 函数。该函数接受两个数组作为参数:第一个数组表示左端点,第二个数组表示右端点。例如,创建一个十字形的左闭右开区间数组:

import pandas as pd
import numpy as np

x = np.array([[0, 2, 4], [2, 4, 6], [4, 6, 8]])
y = np.array([[2, 4, 6], [0, 2, 4], [4, 6, 8]])

index = pd.IntervalIndex.from_arrays(left=x, right=y, closed='left')
print(index)
# 输出:
# IntervalIndex([[0, 2), [2, 4), [4, 6), [2, 4), [4, 6), [6, 8)],
#               closed='left',
#               dtype='interval[int64]')

上面的代码创建了一个 3×3 的左闭右开区间数组,并将其转化为一个 IntervalIndex 对象。该对象可以用于 Pandas 的数据结构中,例如 DataFrame 的行或列索引。

区间的筛选、拼接、截取和重建

创建区间数组后,经常需要对其进行一些基本的操作。下面介绍 Pandas 中支持的一些常用操作和技巧。

筛选区间

通过 index.get_loc() 方法可以找到全部区间和特定点所在的区间:

import pandas as pd

arr = pd.interval_range(start=0, end=10, periods=5, closed='left')

# 所有区间
print(arr)
# 输出:IntervalIndex([[0, 2), [2, 4), [4, 6), [6, 8), [8, 10)),
#               closed='left',
#               dtype='interval[float64]')

# 过滤左端点小于等于 2 的区间
mask = arr.left <= 2
print(arr[mask])
# 输出:IntervalIndex([[0, 2)],
#               closed='left',
#               dtype='interval[float64]')

上面的代码使用布尔掩码筛选出左端点小于等于 2 的区间。

拼接区间

通过 pd.concat() 函数可以将两个区间数组拼接在一起:

import pandas as pd

arr1 = pd.interval_range(start=0, end=5, periods=3, closed='left')
arr2 = pd.interval_range(start=5, end=10, periods=3, closed='left')

print(pd.concat([arr1, arr2]))
# 输出:IntervalIndex([[0, 2), [2, 4), [4, 5), [5, 7), [7, 9), [9, 10)),
#               closed='left',
#               dtype='interval[float64]')

截取区间

通过 pd.IntervalIndex.overlaps() 方法可以判断两个区间是否有交集。利用这一点,可以截取目标区间包含的所有子区间:

import pandas as pd

arr = pd.interval_range(start=0, end=10, periods=5, closed='left')
target = pd.Interval(left=2, right=6, closed='left')

mask = arr.overlaps(target)
print(arr[mask])
# 输出:IntervalIndex([[2, 4), [4, 6)),
#               closed='left',
#               dtype='interval[float64]')

上面的代码通过计算区间数组和目标区间是否有交集,筛选出所有包含在目标区间内的子区间。

重建区间

通过 pd.IntervalIndex.to_series() 方法可以将区间数组重建为 Series 对象。具体来说,该方法会将所有区间作为索引,并赋予每个区间一个默认值:

import pandas as pd

arr = pd.interval_range(start=0, end=10, periods=5, closed='left')
s = arr.to_series()

print(s)
# 输出:[0, 2)    NaN
#       [2, 4)    NaN
#       [4, 6)    NaN
#       [6, 8)    NaN
#       [8, 10)   NaN
#       dtype: float64

上面的代码将创建的区间数组转换成了一个 Series 对象,并为每个区间赋值了一个默认值。这个默认值可以通过传递给 pd.IntervalIndex.to_series() 方法的 fill_value 参数来指定,默认为 np.nan

结论

通过 Pandas 中的区间数据类型,我们可以轻松地创建、存储和处理连续范围的数据。其中,pd.Intervalpd.IntervalIndex 类是 Pandas 中最为基础的区间数据类型,能够完成大多数区间计算和操作。此外,pd.interval_range()pd.IntervalIndex.from_arrays() 函数可以帮助我们快速地创建一维和二维的区间数组,为数据分析和机器学习提供了很大的便利。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程