當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。