簡體   English   中英

pandas 函數之間的區別:df.assign() 與 df.reset_index()

[英]Difference between pandas functions: df.assign() vs df.reset_index()

假設我有一個 DataFrame:

    stuff  temp
id             
1       3  20.0
1       6  20.1
1       7  21.4
2       1  30.2
2       3   0.0
2       2  34.0
3       7   0.0
3       6   0.0
3       2  14.4

我想刪除索引; 用什么方法比較好?

  • df.reset_index(drop=True) ,這是我通常會使用的

  • 但是還有df.assign(Index=range(len(df))).set_index('Index') ,我通常不使用

  • 還有,還有其他方法嗎?

好吧,我想找到最有效/最好的方法來刪除pd.DataFrame的索引。 你能給我一個明確的解釋嗎? 我正在做一個高效的代碼編寫項目,我想知道最好的選擇。 謝謝。

以下是可用於重置 pandas DataFrame索引的幾種方法:

import pandas as pd

dummy_data = lambda: pd.DataFrame(
    columns = ['id', 'stuff', 'temp'],
    data = [
        [3, 20.0, 1],
        [6, 20.1, 1],
        [7, 21.4, 1],
        [1, 30.2, 2],
        [3, 0.0, 2],
        [2, 34.0, 2],
        [7, 0.0, 3],
        [6, 0.0, 3],
        [2, 14.4, 3],
    ]
).set_index('id', drop=True)

df = dummy_data()
method_1 = df.reset_index(drop=True)

df = dummy_data()
method_2 = df.reset_index(drop=True, inplace=True)

df = dummy_data()
method_3 = df.index = range(df.shape[0])

df = dummy_data()
method_4 = df.assign(Index=range(len(df))).set_index('Index')

df = dummy_data()
method_5 = df.assign(Index=range(len(df))).set_index('Index', inplace=True)

重要提示:比較上述實現時,在測量每個實現的性能之前重新創建測試 dataframe 很重要。 由於某些解決方案使用 inplace inplace=True ,因此它們修改了底層 dataframe,從而修改了用於衡量下一個方法性能的 dataframe。

比較執行時間

使用%%timeit魔法,我們可以比較每種方法,以確定它們的整體性能。

下表總結了每種重置索引的常規方法的時間分析,使用原作者問題中提供的表格:

方法 執行時間 [µs ± µs /100000 個循環每個] 觀察
方法一 42.4 ± 1.11 使用df.reset_index(drop=True)
方法二 12.7 ± 2.72 方法 1相同,但就地: df.reset_index(drop=True, inplace=True)
方法三 10.6 ± 0.082 覆蓋索引: df.index = range(df.shape[0])
方法四 812 ± 21.5 Assign 顯然是最慢的方法
方法五 692 ± 50.2 通過就地進行更改,分配得到了一點改進

根據以上結果,似乎最快的重置索引的方法是覆蓋原始索引,如第三種方法所示( df.index = range(df.shape[0]) )。

此外,當將屬性inplace設置為True時, pandas.DataFrame.reset_indexpandas.DataFrame.set_index運行得更快。 這是因為當設置為True時,這兩種方法都會修改 DataFrame(而不是創建新對象)。

增加行數似乎會按比例影響所有方法。 因此,當使用 9,000,000 行的輸入數據集運行性能測試時,方法 3 似乎仍然是測試實現中最快的:

方法 執行時間 [µs ± µs /100000 個循環每個] 觀察
方法一 829±2430 使用df.reset_index(drop=True)
方法二 12.2 ± 0.095 方法 1相同,但就地: df.reset_index(drop=True, inplace=True)
方法三 10.5 ± 0.095 覆蓋索引: df.index = range(df.shape[0])
方法四 832±67 Assign 顯然是最慢的方法
方法五 747 ± 25.2 通過就地進行更改,分配得到了一點改進

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM