HOWTO · Pandas
獲取 Pandas 列中的唯一值並進行排序
本教程演示瞭如何在 Pandas DataFrame 中查詢列中的唯一值以及如何對其進行排序。
本頁內容
DataFrame 的欄是 Pandas Series。呼叫其 unique() 函式](/zh-tw/api/python-pandas/pandas-series-series.unique-function/),即可依值首次出現的順序取得不重複值。若需要保留對應資料列及其他欄位,請使用 drop_duplicates();若要排序值或資料列,則可使用 Python 的 sorted() 或 Pandas 的 [sort_values()`。
範例使用一個包含職業與部門的小型 DataFrame。程式碼中的職業與部門名稱,以及輸出中的名稱與標籤,均維持英文。執行此範例:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import pandas as pd
df = pd.DataFrame({
"profession": ["designer", "engineer", "designer", "analyst"],
"department": ["product", "platform", "research", "finance"],
})
professions = df["profession"].unique()
print(professions)
print(type(professions).__name__)
<StringArray>
['designer', 'engineer', 'analyst']
Length: 3, dtype: str
StringArray
從 DataFrame 欄取得不重複值
選取 df["profession"] 會得到一個 Series。其 unique() 函式會依首次出現的順序,為每種不重複的職業回傳一個值;這些值不會因此排序。實際回傳類型取決於 Series 的 dtype。此範例使用 Pandas 的字串擴充 dtype,因此結果是輸出所示的 StringArray。其他 dtype 可能會產生 NumPy 陣列或不同的擴充陣列。請依照你的資料調整欄名。若只需要不重複值的數量,可使用 len(df["profession"].unique());len(df) 計算的則是資料列數,其中也包含職業重複的資料列。若後續步驟需要一般的 Python 清單,可對結果呼叫 .tolist()。
每種不重複的欄值保留一列
如果要保留資料列,而不是只取得一組值,請在 DataFrame 上呼叫 drop_duplicates(subset="profession")。結果仍是 DataFrame:每個保留的資料列都包含其部門,而且預設會保留每種職業首次出現的那一列。輸出表格中的欄名和資料值仍為英文;第二筆設計師資料列會被移除,第一筆設計師資料列及其 product 部門則會保留。這種做法不會依其他規則挑選代表資料列;若要保留符合不同條件的資料,請先排序或以其他方式選好資料列。預設情況下,結果會保留原本的索引標籤,因此索引可能不連續。如果重複資料是由多個欄位的組合來判定,可以在 subset 傳入包含多個欄名的清單。
import pandas as pd
df = pd.DataFrame({
"profession": ["designer", "engineer", "designer", "analyst"],
"department": ["product", "platform", "research", "finance"],
})
unique_rows = df.drop_duplicates(subset="profession")
print(unique_rows.to_string(index=False))
print(type(unique_rows).__name__)
profession department
designer product
engineer platform
analyst finance
DataFrame
排序不重複值或 DataFrame 資料列
Python 內建的 sorted() 會回傳按升冪排列的新清單。若要排序不重複值,可將它與 unique() 搭配使用;若要保留重複值,則可直接排序 Series。若要按降冪排序,請將 reverse=True 傳給 sorted()。
若要排序資料列並讓其他欄位的資料維持在同一列,請使用 sort_values(by="profession")。它會回傳 DataFrame,且預設按升冪排序;若要降冪排序,請設定 ascending=False。這兩種方式適用於不同需求:排序不重複值會得到清單,排序資料列則會保留整列資料。你可以將多個欄名組成清單傳給 by,依優先順序排序。輸出中的清單只包含職業名稱;最後的表格則保留每筆資料列及其部門,並依職業從 engineer 排到 analyst。範例中的名稱與表格欄名維持英文。sort_values() 預設保留原本的索引標籤;若設定 ignore_index=True,排序後的結果會改用新的連續索引。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import pandas as pd
df = pd.DataFrame({
"profession": ["designer", "engineer", "designer", "analyst"],
"department": ["product", "platform", "research", "finance"],
})
print(sorted(df["profession"].unique()))
print(sorted(df["profession"].unique(), reverse=True))
print(df.sort_values(by="profession", ascending=False).to_string(index=False))
['analyst', 'designer', 'engineer']
['engineer', 'designer', 'analyst']
profession department
engineer platform
designer product
designer research
analyst finance