当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python dask.dataframe.DataFrame.set_index用法及代码示例


用法:

DataFrame.set_index(other, drop=True, sorted=False, npartitions=None, divisions=None, inplace=False, **kwargs)

使用现有列设置 DataFrame 索引(行标签)。

这将重新对齐数据集,以按新列排序。这会对性能产生重大影响,因为在该列上连接、分组、查找等都快得多。然而,这种性能提升是有代价的,对并行数据集进行排序需要昂贵的 shuffle。通常我们在数据摄取和过滤之后直接 set_index 一次,然后从排序的数据集执行许多廉价的计算。

此函数的运行方式与pandas.set_index 完全相同,只是性能成本不同(dask 数据帧set_index 更昂贵)。在正常操作下,此函数对索引列进行初始传递以计算近似分位数以用作未来的划分。然后它第二次传递数据,将每个输入分区分成几个部分,并按排序顺序将这些部分共享给所有输出分区。

在某些情况下,我们可以减轻这些成本,例如,如果您的数据集已经排序,那么我们可以避免制作许多小片段,或者如果您知道拆分新索引列的好值,那么我们可以避免最初的数据传递。例如,如果您的新索引是日期时间索引并且您的数据已经按天排序,那么整个操作可以免费完成。您可以使用以下参数控制这些选项。

参数

other: string or Dask Series
drop: boolean, default True

删除要用作新索引的列。

sorted: bool, optional

如果索引列已经按升序排序。默认为假

npartitions: int, None, or ‘auto’

输出分区的理想数量。如果没有,使用与输入相同的值。如果 ‘auto’ 则由内存使用决定。仅在未给出 divisions 时使用。如果给定 divisions ,则输出分区的数量将为 len(divisions) - 1

divisions: list, optional

“dividing lines” 用于将新索引拆分为分区。对于 divisions=[0, 10, 50, 100] ,将有三个输出分区,其中新索引分别包含 [0, 10)、[10, 50) 和 [50, 100)。见https://docs.dask.org/en/latest/dataframe-design.html#partitions。如果未给出(默认),则通过立即计算数据并查看其值的分布来计算良好的划分。对于大型数据集,这可能很昂贵。请注意,如果 sorted=True ,则假定指定的分区与数据中的现有分区匹配;如果这是不正确的,您应该将部门留空并在 set_index 之后调用 repartition

inplace: bool, optional

Dask 不支持就地修改 DataFrame。默认为假。

shuffle: string, ‘disk’ or ‘tasks’, optional

'disk' 用于single-node 操作或'tasks' 用于分布式操作。将由您当前的调度程序推断。

compute: bool, default False

是否触发立即计算。默认为假。请注意,即使您设置了 compute=False ,如果 divisionsNone ,仍会触发立即计算。

partition_size: int, optional

每个分区的所需大小(以字节为单位)。仅在npartitions='auto' 时使用

例子

>>> import dask
>>> ddf = dask.datasets.timeseries(start="2021-01-01", end="2021-01-07", freq="1H").reset_index()
>>> ddf2 = ddf.set_index("x")
>>> ddf2 = ddf.set_index(ddf.x)
>>> ddf2 = ddf.set_index(ddf.timestamp, sorted=True)

一个常见的情况是当我们有一个知道要排序的日期时间列并按天完全划分时。我们可以通过指定列是预先排序的以及沿其分隔的特定分区来免费设置此索引

>>> import pandas as pd
>>> divisions = pd.date_range(start="2021-01-01", end="2021-01-07", freq='1D')
>>> divisions
DatetimeIndex(['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04',
               '2021-01-05', '2021-01-06', '2021-01-07'],
              dtype='datetime64[ns]', freq='D')

请注意 len(divisons) 等于 npartitions + 1 。这是因为divisions代表了每个分区的上下界。第一项是第一个分区的下界,第二项是第二个分区的下界和第一个分区的上界,以此类推。 second-to-last 项是最后一个分区的下限,最后一个(额外)项是最后一个分区的上限。

>>> ddf2 = ddf.set_index("timestamp", sorted=True, divisions=divisions.tolist())

如果您将在相同(或相似)的数据集上重复运行set_index,您可以通过让 Dask 计算一次好的划分来节省时间,然后 copy-pasting 重复使用它们。这对于在 Jupyter 笔记本中运行特别有用:

>>> ddf2 = ddf.set_index("name")  # slow, calculates data distribution
>>> ddf2.divisions  
["Alice", "Laura", "Ursula", "Zelda"]
>>> # ^ Now copy-paste this and edit the line above to:
>>> # ddf2 = ddf.set_index("name", divisions=["Alice", "Laura", "Ursula", "Zelda"])

相关用法


注:本文由纯净天空筛选整理自dask.org大神的英文原创作品 dask.dataframe.DataFrame.set_index。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。