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.Interval 和 pd.IntervalIndex 类是 Pandas 中最为基础的区间数据类型,能够完成大多数区间计算和操作。此外,pd.interval_range() 和 pd.IntervalIndex.from_arrays() 函数可以帮助我们快速地创建一维和二维的区间数组,为数据分析和机器学习提供了很大的便利。
极客笔记