[英]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_index
和pandas.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.