HOWTO · Pandas
在 Pandas 中刪除最後一行和最後一列
本教程演示如何在 Python 中刪除 Pandas DataFrame 中的行和列。
本頁內容
若要從 Pandas DataFrame 移除最後一個實體資料列,可使用 df.iloc[:-1] 選取最後一列之前的所有資料列。這會回傳新的 DataFrame,不會改動 df,即使最後一個索引標籤重複也一樣。若要移除最後 n 列,請在 n 為正數時使用 df.iloc[:-n];當 n 等於零時要另外處理,因為 [:-0] 不會選取任何資料列。空的 DataFrame 沒有最後一列,而 df.iloc[:-1] 會讓它保持空白。
在 Pandas 中使用 drop() 方法刪除資料列與欄
drop() 預設會依索引標籤移除資料列。若要依標籤移除欄,傳入 columns=;這比變更 axis 更清楚。預設的 inplace=False 會回傳新的 DataFrame,因此若要保留結果,請將回傳值指派給變數。例如,df.drop(index=12) 會移除標籤為 12 的資料列,而 df.drop(columns=["Q", "R"]) 會移除這些欄。
執行以下範例,從 DataFrame 移除最後一列:
import pandas as pd
df = pd.DataFrame(
{"name": ["Ada", "Lin", "Sam"], "score": [91, 84, 88]},
index=[10, 11, 12],
)
result = df.iloc[:-1]
print(result)
name score
10 Ada 91
11 Lin 84
若在 drop() 中使用 inplace=True,原始物件會直接變更,而且此方法不會回傳更新後的 DataFrame。
在 Pandas 的多重索引 DataFrame 中使用 drop() 方法刪除最後一列
使用 df.iloc[:-1] 時,MultiIndex 資料列是依位置選取,因此即使其索引元組先前也出現過,仍只會移除最後一列。相較之下,df.drop(df.index[-1]) 是依標籤選取,會移除所有索引元組相同的資料列。依位置切片不會移除最後一個第一層索引群組。若要移除最後 n 列,請在 n 為正數時使用 df.iloc[:-n];若 n 為零,則保留所有資料列;若 n 大於或等於資料列數,結果就不會有任何資料列。
此範例重複使用最後一個 MultiIndex 元組,示範 iloc 只會移除它最後一次出現的那一列。
import pandas as pd
index = pd.MultiIndex.from_tuples(
[("deer", "speed"), ("deer", "weight"), ("dog", "speed"), ("dog", "speed")],
names=["animal", "measure"],
)
df = pd.DataFrame({"value": [4, 12, 8, 9]}, index=index)
result = df.iloc[:-1]
remaining = list(zip(result.index.tolist(), result["value"].tolist()))
print(remaining)
[(('deer', 'speed'), 4), (('deer', 'weight'), 12), (('dog', 'speed'), 8)]
在 Pandas 中使用 drop() 方法刪除最後一欄
欄的位置從左側的零開始計數;負數位置則從右側往回計算,因此 df.columns[-1] 會指出最後一欄。若要一次移除最後 n 欄,請選取 df.columns[-n:] 切片,並將它傳給 drop(columns=...):
import pandas as pd
df = pd.DataFrame({"P": [0, 4, 8], "Q": [1, 5, 9], "R": [2, 6, 10], "S": [3, 7, 11]})
n = 2
result = df.drop(columns=df.columns[-n:])
print(result)
P Q
0 0 1
1 4 5
2 8 9
此處 n = 2 會選取最右側的兩欄。請使用正數 n;當 n 等於零時,應保留原有欄,而不要使用 [-n:],因為那會選取所有欄。若 n 大於欄數,切片會選取所有欄,留下不含任何欄的 DataFrame。