送你一個Python 資料排序的好方法

華為雲開發者社群發表於2021-10-02
摘要:學習 Pandas排序方法是開始或練習使用 Python進行基本資料分析的好方法。最常見的資料分析是使用電子表格、SQL或pandas 完成的。使用 Pandas 的一大優點是它可以處理大量資料並提供高效能的資料操作能力。

本文分享自華為雲社群《Pandas Sort:你的 Python 資料排序指南》,作者:Yuchuan。

學習 Pandas排序方法是開始或練習使用 Python進行基本資料分析的好方法。最常見的資料分析是使用電子表格、SQL或pandas 完成的。使用 Pandas 的一大優點是它可以處理大量資料並提供高效能的資料操作能力。

在本教程中,您將學習如何使用.sort_values()和.sort_index(),這將使您能夠有效地對 DataFrame 中的資料進行排序。

在本教程結束時,您將知道如何:

• 按一列或多列的值對Pandas DataFrame進行排序
• 使用ascending引數更改排序順序
• 通過index使用對 DataFrame 進行排序.sort_index()
• 在對值進行排序時組織缺失的資料
• 使用set to 對DataFrame進行就地排序inplaceTrue

要學習本教程,您需要對Pandas DataFrames有基本的瞭解,並對從檔案中讀取資料有一定的瞭解。

Pandas 排序方法入門

快速提醒一下,DataFrame是一種資料結構,行和列都帶有標記的軸。您可以按行或列值以及行或列索引對 DataFrame 進行排序。

行和列都有索引,它是資料在 DataFrame 中位置的數字表示。您可以使用 DataFrame 的索引位置從特定行或列中檢索資料。預設情況下,索引號從零開始。您也可以手動分配自己的索引。

準備資料集

在本教程中,您將使用美國環境保護署 (EPA) 為 1984 年至 2021 年間製造的車輛編制的燃油經濟性資料。EPA 燃油經濟性資料集非常棒,因為它包含許多不同型別的資訊,您可以對其進行排序上,從文字到數字資料型別。該資料集總共包含八十三列。

要繼續,您需要安裝pandas Python 庫。本教程中的程式碼是使用 pandas 1.2.0 和Python 3.9.1 執行的。

注意:整個燃油經濟性資料集約為 18 MB。將整個資料集讀入記憶體可能需要一兩分鐘。限制行數和列數有助於提高效能,但下載資料仍需要幾秒鐘的時間。

出於分析目的,您將按品牌、型號、年份和其他車輛屬性檢視車輛的 MPG(每加侖英里數)資料。您可以指定要讀入 DataFrame 的列。對於本教程,您只需要可用列的子集。

以下是將燃油經濟性資料集的相關列讀入 DataFrame 並顯示前五行的命令:

>>>
>>> import pandas as pd

>>> column_subset = [
...     "id",
...     "make",
...     "model",
...     "year",
...     "cylinders",
...     "fuelType",
...     "trany",
...     "mpgData",
...     "city08",
...     "highway08"
... ]

>>> df = pd.read_csv(
...     "https://www.fueleconomy.gov/feg/epadata/vehicles.csv",
...     usecols=column_subset,
...     nrows=100
... )

>>> df.head()
   city08  cylinders fuelType  ...  mpgData            trany  year
0      19          4  Regular  ...        Y     Manual 5-spd  1985
1       9         12  Regular  ...        N     Manual 5-spd  1985
2      23          4  Regular  ...        Y     Manual 5-spd  1985
3      10          8  Regular  ...        N  Automatic 3-spd  1985
4      17          4  Premium  ...        N     Manual 5-spd  1993
[5 rows x 10 columns]

通過.read_csv()使用資料集 URL 進行呼叫,您可以將資料載入到 DataFrame 中。縮小列會導致更快的載入時間和更少的記憶體使用。為了進一步限制記憶體消耗並快速瞭解資料,您可以使用 指定要載入的行數nrows。

熟悉 .sort_values()

您用於.sort_values()沿任一軸(列或行)對 D​​ataFrame 中的值進行排序。通常,您希望通過一列或多列的值對 DataFrame 中的行進行排序:
image.png

上圖顯示了使用.sort_values()根據highway08列中的值對 DataFrame 的行進行排序的結果。這類似於使用列對電子表格中的資料進行排序的方式。

熟悉 .sort_index()

您用於.sort_index()按行索引或列標籤對 DataFrame 進行排序。與 using 的不同之處.sort_values()在於您是根據其行索引或列名稱對 DataFrame 進行排序,而不是根據這些行或列中的值:
image.png

DataFrame 的行索引在上圖中以藍色標出。索引不被視為一列,您通常只有一個行索引。行索引可以被認為是從零開始的行號。

在單列上對 DataFrame 進行排序

要根據單列中的值對 DataFrame 進行排序,您將使用.sort_values(). 預設情況下,這將返回一個按升序排序的新 DataFrame。它不會修改原始 DataFrame。

按升序按列排序

要使用.sort_values(),請將單個引數傳遞給包含要作為排序依據的列的名稱的方法。在此示例中,您按city08列對 DataFrame 進行排序,該列表示純燃料汽車的城市 MPG:

>>>
>>> df.sort_values("city08")
    city08  cylinders fuelType  ...  mpgData            trany  year
99       9          8  Premium  ...        N  Automatic 4-spd  1993
1        9         12  Regular  ...        N     Manual 5-spd  1985
80       9          8  Regular  ...        N  Automatic 3-spd  1985
47       9          8  Regular  ...        N  Automatic 3-spd  1985
3       10          8  Regular  ...        N  Automatic 3-spd  1985
..     ...        ...      ...  ...      ...              ...   ...
9       23          4  Regular  ...        Y  Automatic 4-spd  1993
8       23          4  Regular  ...        Y     Manual 5-spd  1993
7       23          4  Regular  ...        Y  Automatic 3-spd  1993
76      23          4  Regular  ...        Y     Manual 5-spd  1993
2       23          4  Regular  ...        Y     Manual 5-spd  1985
[100 rows x 10 columns]

這將使用 中的列值對您的 DataFrame 進行排序city08,首先顯示 MPG 最低的車輛。預設情況下,按升序.sort_values()對資料進行排序。儘管您沒有為傳遞給 的引數指定名稱,但.sort_values()您實際上使用了by引數,您將在下一個示例中看到該引數。

更改排序順序

的另一個引數.sort_values()是ascending。預設情況下.sort_values()已經ascending設定True。如果您希望 DataFrame 按降序排序,則可以傳遞False給此引數:

>>>
>>> df.sort_values(
...     by="city08",
...     ascending=False
... )
    city08  cylinders fuelType  ...  mpgData            trany  year
9       23          4  Regular  ...        Y  Automatic 4-spd  1993
2       23          4  Regular  ...        Y     Manual 5-spd  1985
7       23          4  Regular  ...        Y  Automatic 3-spd  1993
8       23          4  Regular  ...        Y     Manual 5-spd  1993
76      23          4  Regular  ...        Y     Manual 5-spd  1993
..     ...        ...      ...  ...      ...              ...   ...
58      10          8  Regular  ...        N  Automatic 3-spd  1985
80       9          8  Regular  ...        N  Automatic 3-spd  1985
1        9         12  Regular  ...        N     Manual 5-spd  1985
47       9          8  Regular  ...        N  Automatic 3-spd  1985
99       9          8  Premium  ...        N  Automatic 4-spd  1993
[100 rows x 10 columns]

通過傳遞False到ascending,您可以顛倒排序順序。現在,您的 DataFrame 按城市條件下測量的平均 MPG 降序排序。MPG 值最高的車輛在第一排。

選擇排序演算法

值得注意的是,pandas 允許您選擇不同的排序演算法來與.sort_values()和一起使用.sort_index()。可用的演算法quicksort,mergesort和heapsort。有關這些不同排序演算法的更多資訊,請檢視Python 中的排序演算法。

對單列進行排序時預設使用的演算法是quicksort。要將其更改為穩定的排序演算法,請使用mergesort。您可以使用or 中的kind引數來執行此操作,如下所示:.sort_values().sort_index()

>>>
>>> df.sort_values(
...     by="city08",
...     ascending=False,
...     kind="mergesort"
... )
    city08  cylinders fuelType  ...  mpgData            trany  year
2       23          4  Regular  ...        Y     Manual 5-spd  1985
7       23          4  Regular  ...        Y  Automatic 3-spd  1993
8       23          4  Regular  ...        Y     Manual 5-spd  1993
9       23          4  Regular  ...        Y  Automatic 4-spd  1993
10      23          4  Regular  ...        Y     Manual 5-spd  1993
..     ...        ...      ...  ...      ...              ...   ...
69      10          8  Regular  ...        N  Automatic 3-spd  1985
1        9         12  Regular  ...        N     Manual 5-spd  1985
47       9          8  Regular  ...        N  Automatic 3-spd  1985
80       9          8  Regular  ...        N  Automatic 3-spd  1985
99       9          8  Premium  ...        N  Automatic 4-spd  1993
[100 rows x 10 columns]

使用kind,您將排序演算法設定為mergesort。之前的輸出使用了預設quicksort演算法。檢視突出顯示的索引,您可以看到行的順序不同。這是因為quicksort不是穩定的排序演算法,而是mergesort。

注意:在 Pandas 中,kind當您對多個列或標籤進行排序時會被忽略。

當您對具有相同鍵的多條記錄進行排序時,穩定的排序演算法將在排序後保持這些記錄的原始順序。因此,如果您計劃執行多種排序,則必須使用穩定的排序演算法。

在多列上對 DataFrame 進行排序

在資料分析中,通常希望根據多列的值對資料進行排序。想象一下,您有一個包含人們名字和姓氏的資料集。先按姓然後按名字排序是有意義的,這樣姓氏相同的人會根據他們的名字按字母順序排列。

在第一個示例中,您在名為 的單個列上對 DataFrame 進行了排序city08。從分析的角度來看,城市條件下的 MPG 是決定汽車受歡迎程度的重要因素。除了城市條件下的 MPG,您可能還想檢視高速公路條件下的 MPG。要按兩個鍵排序,您可以將列名列表傳遞給by:

>>>
>>> df.sort_values(
...     by=["city08", "highway08"]
... )[["city08", "highway08"]]
    city08  highway08
80       9         10
47       9         11
99       9         13
1        9         14
58      10         11
..     ...        ...
9       23         30
10      23         30
8       23         31
76      23         31
2       23         33
[100 rows x 2 columns]

通過指定列名稱city08和的列表highway08,您可以使用 對兩列上的 DataFrame 進行排序.sort_values()。下一個示例將解釋如何指定排序順序以及為什麼注意您使用的列名列表很重要。

按升序按多列排序

要在多個列上對 DataFrame 進行排序,您必須提供一個列名稱列表。例如,要按make和排序model,您應該建立以下列表,然後將其傳遞給.sort_values():

>>>
>>> df.sort_values(
...     by=["make", "model"]
... )[["make", "model"]]
          make               model
0   Alfa Romeo  Spider Veloce 2000
18        Audi                 100
19        Audi                 100
20         BMW                740i
21         BMW               740il
..         ...                 ...
12  Volkswagen      Golf III / GTI
13  Volkswagen           Jetta III
15  Volkswagen           Jetta III
16       Volvo                 240
17       Volvo                 240
[100 rows x 2 columns]

現在您的 DataFrame 按升序排序make。如果有兩個或更多相同的品牌,則按 排序model。在列表中指定列名的順序對應於 DataFrame 的排序方式。

更改列排序順序

由於您使用多列進行排序,因此您可以指定列的排序順序。如果要更改上一個示例中的邏輯排序順序,則可以更改傳遞給by引數的列表中列名的順序:

>>>
>>> df.sort_values(
...     by=["model", "make"]
... )[["make", "model"]]
             make        model
18           Audi          100
19           Audi          100
16          Volvo          240
17          Volvo          240
75          Mazda          626
..            ...          ...
62           Ford  Thunderbird
63           Ford  Thunderbird
88     Oldsmobile     Toronado
42  CX Automotive        XM v6
43  CX Automotive       XM v6a
[100 rows x 2 columns]

您的 DataFrame 現在按model升序按列排序,然後按make是否有兩個或更多相同模型進行排序。您可以看到更改列的順序也會更改值的排序順序。

按降序按多列排序

到目前為止,您僅對多列按升序排序。在下一個示例中,您將根據make和model列按降序排序。要按降序排序,請設定ascending為False:

>>>
>>> df.sort_values(
...     by=["make", "model"],
...     ascending=False
... )[["make", "model"]]
          make               model
16       Volvo                 240
17       Volvo                 240
13  Volkswagen           Jetta III
15  Volkswagen           Jetta III
11  Volkswagen      Golf III / GTI
..         ...                 ...
21         BMW               740il
20         BMW                740i
18        Audi                 100
19        Audi                 100
0   Alfa Romeo  Spider Veloce 2000
[100 rows x 2 columns]

該make列中的值按字母順序model倒序排列,對於具有相同make. 對於文字資料,排序區分大小寫,這意味著大寫文字將首先按升序出現,最後按降序出現。

按具有不同排序順序的多列排序

您可能想知道是否可以使用多個列進行排序並讓這些列使用不同的ascending引數。使用熊貓,您可以通過單個方法呼叫來完成此操作。如果要按升序對某些列進行排序,並按降序對某些列進行排序,則可以將布林值列表傳遞給ascending.

在這個例子中,您排列資料幀由make,model和city08列,與前兩列按照升序排序和city08按降序排列。為此,您將列名列表傳遞給by和布林值列表傳遞給ascending:

>>>
>>> df.sort_values(
...     by=["make", "model", "city08"],
...     ascending=[True, True, False]
... )[["make", "model", "city08"]]
          make               model  city08
0   Alfa Romeo  Spider Veloce 2000      19
18        Audi                 100      17
19        Audi                 100      17
20         BMW                740i      14
21         BMW               740il      14
..         ...                 ...     ...
11  Volkswagen      Golf III / GTI      18
15  Volkswagen           Jetta III      20
13  Volkswagen           Jetta III      18
17       Volvo                 240      19
16       Volvo                 240      18
[100 rows x 3 columns]

現在你的資料幀進行排序make,並model在按升序排列,但與city08按降序排列列。這很有用,因為它按分類順序對汽車進行分組,並首先顯示最高 MPG 的汽車。

根據索引對 DataFrame 進行排序

在對索引進行排序之前,最好先了解索引代表什麼。DataFrame 有一個.index屬性,預設情況下它是其行位置的數字表示。您可以將索引視為行號。它有助於快速行查詢和識別。

按升序按索引排序

您可以根據行索引對 DataFrame 進行排序.sort_index()。像在前面的示例中一樣按列值排序會重新排序 DataFrame 中的行,因此索引變得雜亂無章。當您過濾 DataFrame 或刪除或新增行時,也會發生這種情況。

為了說明 的使用.sort_index(),首先使用以下方法建立一個新的排序 DataFrame .sort_values():

>>>
>>> sorted_df = df.sort_values(by=["make", "model"])
>>> sorted_df
    city08  cylinders fuelType  ...  mpgData            trany  year
0       19          4  Regular  ...        Y     Manual 5-spd  1985
18      17          6  Premium  ...        Y  Automatic 4-spd  1993
19      17          6  Premium  ...        N     Manual 5-spd  1993
20      14          8  Premium  ...        N  Automatic 5-spd  1993
21      14          8  Premium  ...        N  Automatic 5-spd  1993
..     ...        ...      ...  ...      ...              ...   ...
12      21          4  Regular  ...        Y     Manual 5-spd  1993
13      18          4  Regular  ...        N  Automatic 4-spd  1993
15      20          4  Regular  ...        N     Manual 5-spd  1993
16      18          4  Regular  ...        Y  Automatic 4-spd  1993
17      19          4  Regular  ...        Y     Manual 5-spd  1993
[100 rows x 10 columns]

您已經建立了一個使用多個值排序的 DataFrame。請注意行索引是如何沒有特定順序的。要將新 DataFrame 恢復到原始順序,您可以使用.sort_index():

>>>
>>> sorted_df.sort_index()
    city08  cylinders fuelType  ...  mpgData            trany  year
0       19          4  Regular  ...        Y     Manual 5-spd  1985
1        9         12  Regular  ...        N     Manual 5-spd  1985
2       23          4  Regular  ...        Y     Manual 5-spd  1985
3       10          8  Regular  ...        N  Automatic 3-spd  1985
4       17          4  Premium  ...        N     Manual 5-spd  1993
..     ...        ...      ...  ...      ...              ...   ...
95      17          6  Regular  ...        Y  Automatic 3-spd  1993
96      17          6  Regular  ...        N  Automatic 4-spd  1993
97      15          6  Regular  ...        N  Automatic 4-spd  1993
98      15          6  Regular  ...        N     Manual 5-spd  1993
99       9          8  Premium  ...        N  Automatic 4-spd  1993
[100 rows x 10 columns]

現在索引按升序排列。就像in.sort_values()的預設引數是,您可以通過傳遞 更改為降序。對索引進行排序對資料本身沒有影響,因為值不變。ascending.sort_index()TrueFalse

當您使用.set_index(). 如果要使用make和model列設定自定義索引,則可以將列表傳遞給.set_index():

>>>
>>> assigned_index_df = df.set_index(
...     ["make", "model"]
... )
>>> assigned_index_df
                                  city08  cylinders  ...            trany  year
make        model                                    ...
Alfa Romeo  Spider Veloce 2000        19          4  ...     Manual 5-spd  1985
Ferrari     Testarossa                 9         12  ...     Manual 5-spd  1985
Dodge       Charger                   23          4  ...     Manual 5-spd  1985
            B150/B250 Wagon 2WD       10          8  ...  Automatic 3-spd  1985
Subaru      Legacy AWD Turbo          17          4  ...     Manual 5-spd  1993
                                  ...        ...  ...              ...   ...
Pontiac     Grand Prix                17          6  ...  Automatic 3-spd  1993
            Grand Prix                17          6  ...  Automatic 4-spd  1993
            Grand Prix                15          6  ...  Automatic 4-spd  1993
            Grand Prix                15          6  ...     Manual 5-spd  1993
Rolls-Royce Brooklands/Brklnds L       9          8  ...  Automatic 4-spd  1993
[100 rows x 8 columns]

使用此方法,您可以用兩個軸標籤替換預設的基於整數的行索引。這被認為是一個MultiIndex或一個層次索引。您的 DataFrame 現在由多個鍵索引,您可以使用.sort_index()以下鍵進行排序:

>>>
>>> assigned_index_df.sort_index()
                               city08  cylinders  ...            trany  year
make       model                                  ...
Alfa Romeo Spider Veloce 2000      19          4  ...     Manual 5-spd  1985
Audi       100                     17          6  ...  Automatic 4-spd  1993
           100                     17          6  ...     Manual 5-spd  1993
BMW        740i                    14          8  ...  Automatic 5-spd  1993
           740il                   14          8  ...  Automatic 5-spd  1993
                               ...        ...  ...              ...   ...
Volkswagen Golf III / GTI          21          4  ...     Manual 5-spd  1993
           Jetta III               18          4  ...  Automatic 4-spd  1993
           Jetta III               20          4  ...     Manual 5-spd  1993
Volvo      240                     18          4  ...  Automatic 4-spd  1993
           240                     19          4  ...     Manual 5-spd  1993
[100 rows x 8 columns]

首先使用make和列為 DataFrame 分配一個新索引model,然後使用 對索引進行排序.sort_index()。您可以.set_index()在 pandas 文件中閱讀有關使用的更多資訊。

按索引降序排序

對於下一個示例,您將按索引按降序對 DataFrame 進行排序。請記住,通過對 DataFrame 進行排序.sort_values(),您可以通過設定ascending為來反轉排序順序False。此引數也適用於.sort_index(),因此您可以按相反順序對 DataFrame 進行排序,如下所示:

>>>
>>> assigned_index_df.sort_index(ascending=False)
                               city08  cylinders  ...            trany  year
make       model                                  ...
Volvo      240                     18          4  ...  Automatic 4-spd  1993
           240                     19          4  ...     Manual 5-spd  1993
Volkswagen Jetta III               18          4  ...  Automatic 4-spd  1993
           Jetta III               20          4  ...     Manual 5-spd  1993
           Golf III / GTI          18          4  ...  Automatic 4-spd  1993
                               ...        ...  ...              ...   ...
BMW        740il                   14          8  ...  Automatic 5-spd  1993
           740i                    14          8  ...  Automatic 5-spd  1993
Audi       100                     17          6  ...  Automatic 4-spd  1993
           100                     17          6  ...     Manual 5-spd  1993
Alfa Romeo Spider Veloce 2000      19          4  ...     Manual 5-spd  1985
[100 rows x 8 columns]

現在您的 DataFrame 按其索引按降序排序。使用.sort_index()and之間的一個區別.sort_values()是它.sort_index()沒有by引數,因為它預設在行索引上對 DataFrame 進行排序。

探索高階索引排序概念

在資料分析中有很多情況您希望對分層索引進行排序。你已經看到了如何使用make和model在MultiIndex。對於此資料集,您還可以將該id列用作索引。

將id列設定為索引可能有助於連結相關資料集。例如,EPA 的排放資料集也用於id表示車輛記錄 ID。這將排放資料與燃油經濟性資料聯絡起來。在 DataFrame 中對兩個資料集的索引進行排序可以使用其他方法(例如.merge(). 要了解有關在 Pandas 中組合資料的更多資訊,請檢視在 Pandas 中使用 merge()、.join() 和 concat() 組合資料。

對 DataFrame 的列進行排序

您還可以使用 DataFrame 的列標籤對行值進行排序。使用設定為.sort_index()的可選引數將按列標籤對 DataFrame 進行排序。排序演算法應用於軸標籤而不是實際資料。這有助於對 DataFrame 進行目視檢查。axis1

使用資料框 axis

當您在.sort_index()不傳遞任何顯式引數axis=0的情況下使用時,它將用作預設引數。DataFrame的軸指的是索引 ( axis=0) 或列 ( axis=1)。您可以使用這兩個軸來索引和選擇DataFrame 中的資料以及對資料進行排序。

使用列標籤進行排序

您還可以使用 DataFrame 的列標籤作為.sort_index(). 設定根據列標籤對 DataFrame 的列axis進行1排序:

>>>
>>> df.sort_index(axis=1)
    city08  cylinders fuelType  ...  mpgData            trany  year
0       19          4  Regular  ...        Y     Manual 5-spd  1985
1        9         12  Regular  ...        N     Manual 5-spd  1985
2       23          4  Regular  ...        Y     Manual 5-spd  1985
3       10          8  Regular  ...        N  Automatic 3-spd  1985
4       17          4  Premium  ...        N     Manual 5-spd  1993
..     ...        ...      ...  ...      ...              ...   ...
95      17          6  Regular  ...        Y  Automatic 3-spd  1993
96      17          6  Regular  ...        N  Automatic 4-spd  1993
97      15          6  Regular  ...        N  Automatic 4-spd  1993
98      15          6  Regular  ...        N     Manual 5-spd  1993
99       9          8  Premium  ...        N  Automatic 4-spd  1993
[100 rows x 10 columns]

DataFrame 的列按字母升序從左到右排序。如果要按降序對列進行排序,則可以使用ascending=False:

>>>
>>> df.sort_index(axis=1, ascending=False)
    year            trany mpgData  ... fuelType cylinders  city08
0   1985     Manual 5-spd       Y  ...  Regular         4      19
1   1985     Manual 5-spd       N  ...  Regular        12       9
2   1985     Manual 5-spd       Y  ...  Regular         4      23
3   1985  Automatic 3-spd       N  ...  Regular         8      10
4   1993     Manual 5-spd       N  ...  Premium         4      17
..   ...              ...     ...  ...      ...       ...     ...
95  1993  Automatic 3-spd       Y  ...  Regular         6      17
96  1993  Automatic 4-spd       N  ...  Regular         6      17
97  1993  Automatic 4-spd       N  ...  Regular         6      15
98  1993     Manual 5-spd       N  ...  Regular         6      15
99  1993  Automatic 4-spd       N  ...  Premium         8       9
[100 rows x 10 columns]

使用axis=1in .sort_index(),您可以按升序和降序對 DataFrame 的列進行排序。這在其他資料集中可能更有用,例如列標籤對應於一年中的幾個月的資料集。在這種情況下,按月按升序或降序排列資料是有意義的。

在 Pandas 中排序時處理丟失的資料

通常,現實世界的資料有很多缺陷。雖然 Pandas 有多種方法可用於在排序前清理資料,但有時在排序時檢視丟失的資料還是不錯的。你可以用na_position引數來做到這一點。

本教程使用的燃油經濟性資料子集沒有缺失值。為了說明 的使用na_position,首先您需要建立一些缺失的資料。以下程式碼基於現有mpgData列建立了一個新列,對映True了mpgData等於Y和NaN不等於的位置:

>>>
>>> df["mpgData_"] = df["mpgData"].map({"Y": True})
>>> df
    city08  cylinders fuelType  ...            trany  year mpgData_
0       19          4  Regular  ...     Manual 5-spd  1985     True
1        9         12  Regular  ...     Manual 5-spd  1985      NaN
2       23          4  Regular  ...     Manual 5-spd  1985     True
3       10          8  Regular  ...  Automatic 3-spd  1985      NaN
4       17          4  Premium  ...     Manual 5-spd  1993      NaN
..     ...        ...      ...  ...              ...   ...      ...
95      17          6  Regular  ...  Automatic 3-spd  1993     True
96      17          6  Regular  ...  Automatic 4-spd  1993      NaN
97      15          6  Regular  ...  Automatic 4-spd  1993      NaN
98      15          6  Regular  ...     Manual 5-spd  1993      NaN
99       9          8  Premium  ...  Automatic 4-spd  1993      NaN
[100 rows x 11 columns]

現在你有一個名為新列mpgData_包含這兩個True和NaN值。您將使用此列檢視na_position使用這兩種排序方法時的效果。要了解有關使用 的更多資訊.map(),您可以閱讀Pandas 專案:使用 Python 和 Pandas 製作成績簿。

瞭解na_position引數.sort_values()
.sort_values()接受一個名為 的引數na_position,它有助於在您排序的列中組織缺失的資料。如果您對缺失資料的列進行排序,那麼具有缺失值的行將出現在 DataFrame 的末尾。無論您是按升序還是降序排序,都會發生這種情況。

當您對缺失資料的列進行排序時,您的 DataFrame 如下所示:

>>>
>>> df.sort_values(by="mpgData_")
    city08  cylinders fuelType  ...            trany  year mpgData_
0       19          4  Regular  ...     Manual 5-spd  1985     True
55      18          6  Regular  ...  Automatic 4-spd  1993     True
56      18          6  Regular  ...  Automatic 4-spd  1993     True
57      16          6  Premium  ...     Manual 5-spd  1993     True
59      17          6  Regular  ...  Automatic 4-spd  1993     True
..     ...        ...      ...  ...              ...   ...      ...
94      18          6  Regular  ...  Automatic 4-spd  1993      NaN
96      17          6  Regular  ...  Automatic 4-spd  1993      NaN
97      15          6  Regular  ...  Automatic 4-spd  1993      NaN
98      15          6  Regular  ...     Manual 5-spd  1993      NaN
99       9          8  Premium  ...  Automatic 4-spd  1993      NaN
[100 rows x 11 columns]

要改變這種行為,並有丟失的資料第一次出現在你的資料幀,可以設定na_position到first。該na_position引數只接受值last,這是預設值,和first。以下是如何使用na_postion的.sort_values():

>>>
>>> df.sort_values(
...     by="mpgData_",
...     na_position="first"
... )
    city08  cylinders fuelType  ...            trany  year mpgData_
1        9         12  Regular  ...     Manual 5-spd  1985      NaN
3       10          8  Regular  ...  Automatic 3-spd  1985      NaN
4       17          4  Premium  ...     Manual 5-spd  1993      NaN
5       21          4  Regular  ...  Automatic 3-spd  1993      NaN
11      18          4  Regular  ...  Automatic 4-spd  1993      NaN
..     ...        ...      ...  ...              ...   ...      ...
32      15          8  Premium  ...  Automatic 4-spd  1993     True
33      15          8  Premium  ...  Automatic 4-spd  1993     True
37      17          6  Regular  ...  Automatic 3-spd  1993     True
85      17          6  Regular  ...  Automatic 4-spd  1993     True
95      17          6  Regular  ...  Automatic 3-spd  1993     True
[100 rows x 11 columns]

現在,您用於排序的列中的任何缺失資料都將顯示在 DataFrame 的頂部。當您第一次開始分析資料並且不確定是否存在缺失值時,這非常有用。

瞭解na_position引數.sort_index()

.sort_index()也接受na_position。您的 DataFrame 通常不會將NaN值作為其索引的一部分,因此此引數在.sort_index(). 但是,很高興知道,如果您的 DataFrame 確實NaN在行索引或列名中存在,那麼您可以使用.sort_index()和快速識別這一點na_position。

預設情況下,此引數設定為last,將NaN值放置在排序結果的末尾。要改變這種行為,並在你的資料幀先有丟失的資料,設定na_position到first。

使用排序方法修改你的 DataFrame

在所有的例子你迄今所看到的,都.sort_values()和.sort_index()已經返回資料幀物件時,你叫那些方法。這是因為在熊貓排序不工作到位預設。通常,這是使用 Pandas 分析資料的最常見和首選方法,因為它會建立一個新的 DataFrame 而不是修改原始資料。這允許您保留從檔案中讀取資料時的資料狀態。

但是,您可以通過指定inplace值為的可選引數來直接修改原始 DataFrame True。大多數 Pandas 方法都包含inplace引數。下面,您將看到一些inplace=True用於對 DataFrame 進行適當排序的示例。

.sort_values()就地使用

隨著inplace設定為True,您修改原始資料幀,所以排序方法返回None。city08像第一個示例一樣按列的值對 DataFrame 進行排序,但inplace設定為True:

>>>
>>> df.sort_values("city08", inplace=True)

請注意呼叫如何.sort_values()不返回 DataFrame。這是原件的df樣子:

>>>
>>> df
    city08  cylinders fuelType  ...            trany  year mpgData_
99       9          8  Premium  ...  Automatic 4-spd  1993      NaN
1        9         12  Regular  ...     Manual 5-spd  1985      NaN
80       9          8  Regular  ...  Automatic 3-spd  1985      NaN
47       9          8  Regular  ...  Automatic 3-spd  1985      NaN
3       10          8  Regular  ...  Automatic 3-spd  1985      NaN
..     ...        ...      ...  ...              ...   ...      ...
9       23          4  Regular  ...  Automatic 4-spd  1993     True
8       23          4  Regular  ...     Manual 5-spd  1993     True
7       23          4  Regular  ...  Automatic 3-spd  1993     True
76      23          4  Regular  ...     Manual 5-spd  1993     True
2       23          4  Regular  ...     Manual 5-spd  1985     True
[100 rows x 11 columns]

在df物件中,值現在基於city08列按升序排序。您的原始 DataFrame 已被修改,更改將持續存在。避免inplace=True用於分析通常是個好主意,因為對 DataFrame 的更改無法撤消。

.sort_index()就地使用

下一個示例說明這inplace也適用於.sort_index().

由於索引是在您將檔案讀入 DataFrame 時按升序建立的,因此您可以df再次修改物件以使其恢復到初始順序。使用.sort_index()與inplace設定為True修改資料框:

>>>
>>> df.sort_index(inplace=True)
>>> df
    city08  cylinders fuelType  ...            trany  year mpgData_
0       19          4  Regular  ...     Manual 5-spd  1985     True
1        9         12  Regular  ...     Manual 5-spd  1985      NaN
2       23          4  Regular  ...     Manual 5-spd  1985     True
3       10          8  Regular  ...  Automatic 3-spd  1985      NaN
4       17          4  Premium  ...     Manual 5-spd  1993      NaN
..     ...        ...      ...  ...              ...   ...      ...
95      17          6  Regular  ...  Automatic 3-spd  1993     True
96      17          6  Regular  ...  Automatic 4-spd  1993      NaN
97      15          6  Regular  ...  Automatic 4-spd  1993      NaN
98      15          6  Regular  ...     Manual 5-spd  1993      NaN
99       9          8  Premium  ...  Automatic 4-spd  1993      NaN
[100 rows x 11 columns]

現在您的 DataFrame 已使用.sort_index(). 由於您的 DataFrame 仍然具有其預設索引,因此按升序對其進行排序會將資料放回其原始順序。

如果您熟悉 Python 的內建函式sort()and sorted(),那麼inplacepandas 排序方法中可用的引數可能會感覺非常相似。有關更多資訊,您可以檢視如何在 Python 中使用 sorted() 和 sort()。

結論

您現在知道如何使用 pandas 庫的兩個核心方法:.sort_values()和.sort_index(). 有了這些知識,您就可以使用 DataFrame 執行基本的資料分析。雖然這兩種方法之間有很多相似之處,但通過檢視它們之間的差異,可以清楚地知道使用哪一種方法來執行不同的分析任務。

在本教程中,您學習瞭如何:

• 按一列或多列的值對Pandas DataFrame進行排序
• 使用ascending引數更改排序順序
• 通過index使用對 DataFrame 進行排序.sort_index()
• 在對值進行排序時組織缺失的資料
• 使用set to 對DataFrame進行就地排序inplaceTrue

這些方法是精通資料分析的重要組成部分。它們將幫助您建立一個強大的基礎,您可以在此基礎上執行更高階的 Pandas 操作。如果您想檢視 Pandas 排序方法更高階用法的一些示例,那麼 Pandas文件是一個很好的資源。

點選關注,第一時間瞭解華為雲新鮮技術~

相關文章