送你一個Python 數據排序的好方法

摘要:學習 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 中的行進行排序:

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

熟悉 .sort_index()

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

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文檔是一個很好的資源。

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章