<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          利用Pandas操作DataFrame的列與行

          共 8312字,需瀏覽 17分鐘

           ·

          2022-10-14 23:30



          介    紹

          本章介紹DataFrame的許多基本操作。許多秘笈與第1章“Pandas基礎(chǔ)”中的秘笈相似,只不過(guò)第1章主要討論的是Series的操作。

          選擇多個(gè)DataFrame列

          可以通過(guò)將列名稱(chēng)傳遞給DataFrame的索引操作符來(lái)選擇單個(gè)列。本書(shū)1.6節(jié)“選擇列”對(duì)此已有介紹。一般來(lái)說(shuō),分析人員需要關(guān)注和處理的是當(dāng)前工作數(shù)據(jù)集的一個(gè)子集,而這正是通過(guò)選擇多個(gè)列來(lái)獲得的。在此秘笈中,我們將從movie數(shù)據(jù)集中選擇所有的actor(演員)和director(導(dǎo)演)相關(guān)數(shù)據(jù)列。

          實(shí)戰(zhàn)操作

          (1)讀取movie數(shù)據(jù)集,并將所需列的列表傳遞給索引操作符。

          >>> import pandas as pd
          >>> import numpy as np
          >>> movies = pd.read_csv("data/movie.csv")
          >>> movie_actor_director = movies[
          ...  [
          ...   "actor_1_name",
          ...   "actor_2_name",
          ...   "actor_3_name",
          ...   "director_name",
          ...  ]
          ... ]
          >>> movie_actor_director.head()
           actor_1_name actor_2_name actor_3_name director_name
          0 CCH Pounder Joel Dav... Wes Studi James Ca...
          1 Johnny Depp Orlando ... Jack Dav... Gore Ver...
          2 Christop... Rory Kin... Stephani... Sam Mendes
          3 Tom Hardy Christia... Joseph G... Christop...
          4 Doug Walker Rob Walker NaN Doug Walker

          (2)在某些情況下,我們僅需要選擇DataFrame的一列,此時(shí)使用索引操作可以返回一個(gè)Series或一個(gè)DataFrame。如果我們傳遞一個(gè)包含單個(gè)項(xiàng)目的列表,則將返回一個(gè)DataFrame;如果只傳遞一個(gè)包含列名稱(chēng)的字符串,則將返回一個(gè)Series。

          >>> type(movies[["director_name"]])
          <class 'pandas.core.frame.DataFrame'>

          >>> type(movies["director_name"])
          <class 'pandas.core.series.Series'>

          (3)我們也可以使用.loc屬性按名稱(chēng)提取出一列。因?yàn)榇怂饕僮饕笫紫葌鬟f一個(gè)行選擇器,所以我們將使用冒號(hào)(:)表示一個(gè)選擇所有行的切片。這也可以返回一個(gè)DataFrame或Series。

          >>> type(movies.loc[:, ["director_name"]])
          <class 'pandas.core.frame.DataFrame'>

          >>> type(movies.loc[:, "director_name"])
          <class 'pandas.core.series.Series'>

          原理解釋

          DataFrame的索引操作符非常靈活,可以接收許多不同的對(duì)象。如果傳遞的是一個(gè)字符串,那么它將返回一維的Series;如果將列表傳遞給索引操作符,那么它將以指定順序返回列表中所有列的DataFrame。

          步驟(2)顯示了如何選擇單個(gè)列作為DataFrame和Series。一般來(lái)說(shuō),可以使用字符串選擇單個(gè)列,從而得到一個(gè)Series。如果需要一個(gè)DataFrame,則可以將列名稱(chēng)放在一個(gè)單元素的列表中。

          步驟(3)顯示了如何使用.loc屬性提取Series或DataFrame。

          擴(kuò)展知識(shí)

          在索引操作符內(nèi)部傳遞長(zhǎng)列表可能會(huì)導(dǎo)致可讀性問(wèn)題。為了解決這個(gè)問(wèn)題,你可以先將所有列名稱(chēng)保存到一個(gè)列表變量中。以下代碼可獲得與步驟(1)相同的結(jié)果。

          >>> cols = [
          ...  "actor_1_name",
          ...  "actor_2_name",
          ...  "actor_3_name",
          ...  "director_name",
          ... ]
          >>> movie_actor_director = movies[cols]

          使用Pandas時(shí),最常見(jiàn)的異常之一是KeyError。該問(wèn)題主要是由于錯(cuò)誤地輸入了列或索引名稱(chēng)。每當(dāng)嘗試不使用列表進(jìn)行多列選擇時(shí),都很容易引發(fā)相同的錯(cuò)誤。

          >>> movies[
          ...  "actor_1_name",
          ...  "actor_2_name",
          ...  "actor_3_name",
          ...  "director_name",
          ... ]
          Traceback (most recent call last):
           ...
          KeyError: ('actor_1_name''actor_2_name''actor_3_name''director_ 
          name'
          )

          使用方法選擇列

          盡管列選擇通常是使用索引操作符完成的,但仍有一些DataFrame方法可以按其他方式進(jìn)行選擇。例如,.select_dtypes和.filter就是兩個(gè)很有用的可以選擇列的方法。

          如果要按類(lèi)型選擇,則需要熟悉Pandas數(shù)據(jù)類(lèi)型。在1.5節(jié)“了解數(shù)據(jù)類(lèi)型”中對(duì)Pandas數(shù)據(jù)類(lèi)型進(jìn)行了詳細(xì)說(shuō)明。

          實(shí)戰(zhàn)操作

          (1)讀取movie數(shù)據(jù)集,然后縮短要顯示的列名,最后使用.get_dtype_counts方法輸出包含每種特定數(shù)據(jù)類(lèi)型的列數(shù)。

          >>> movies = pd.read_csv("data/movie.csv")
          >>> def shorten(col):
          ...  return (
          ...   str(col)
          ...   .replace("facebook_likes""fb")
          ...   .replace("_for_reviews""")
          ...  ) 
          >>> movies = movies.rename(columns=shorten)
          >>> movies.get_dtype_counts() 
          float64  13
          int64   3
          object  12
          dtype: int64

          (2)使用.select_dtypes方法僅選擇數(shù)據(jù)類(lèi)型為整數(shù)的列。

          >>> movies.select_dtypes(include="int").head()
           num_voted_users cast_total_fb movie_fb
          0 886204 4834 33000
          1 471220 48350 0
          2 275868 11700 85000
          3 1144337 106759 164000
          4 8 143 0

          (3)如果要選擇所有數(shù)字列,則可以將字符串number傳遞給include參數(shù)。

          >>> movies.select_dtypes(include="number").head() 
           num_critics duration ... aspect_ratio movie_fb
          0 723.0 178.0 ... 1.78 33000
          1 302.0 169.0 ... 2.35 0
          2 602.0 148.0 ... 2.35 85000
          3 813.0 164.0 ... 2.35 164000
          4 NaN NaN ... NaN 0

          (4)如果需要整數(shù)和字符串列,則可以執(zhí)行以下操作。

          >>> movies.select_dtypes(include=["int""object"]).head()
           color direc/_name ... conte/ating movie_fb
          0 Color James Cameron ... PG-13 33000
          1 Color Gore Verbinski ... PG-13 0
          2 Color Sam Mendes ... PG-13 85000
          3 Color Christopher Nolan ... PG-13 164000
          4 NaN Doug Walker ... NaN 0

          (5)要排除僅包含浮點(diǎn)數(shù)字的列,可執(zhí)行以下操作。

          >>> movies.select_dtypes(exclude="float").head() 
           color director_name ... content_rating movie_fb
          0 Color James Ca... ... PG-13 33000
          1 Color Gore Ver... ... PG-13 0
          2 Color Sam Mendes ... PG-13 85000
          3 Color Christop... ... PG-13 164000
          4 NaN Doug Walker ... NaN 0

          (6)選擇列的另一種方法是使用.filter 方法。此方法很靈活,可以根據(jù)使用的參數(shù)搜索列名(或索引標(biāo)簽)。在這里,我們將使用like參數(shù)搜索所有Facebook列或包含確切字符串fb的列名稱(chēng)。like參數(shù)將檢查列名中的子字符串。

          >>> movies.filter(like="fb").head()
           director_fb actor_3_fb ... actor_2_fb movie_fb
          0 0.0 855.0 ... 936.0 33000
          1 563.0 1000.0 ... 5000.0 0
          2 0.0 161.0 ... 393.0 85000
          3 22000.0 23000.0 ... 23000.0 164000
          4 131.0 NaN ... 12.0 0

          (7).filter方法有很多相關(guān)技巧(或參數(shù))。例如,如果使用items參數(shù),則可以傳入一個(gè)列名稱(chēng)的列表。

          >>> cols = [
          ...  "actor_1_name",
          ...  "actor_2_name",
          ...  "actor_3_name",
          ...  "director_name",
          ... ]
          >>> movies.filter(items=cols).head() 
           actor_1_name ... director_name
          0 CCH Pounder ... James Cameron
          1 Johnny Depp ... Gore Verbinski
          2 Christoph Waltz ... Sam Mendes
          3 Tom Hardy ... Christopher Nolan
          4 Doug Walker ... Doug Walker

          (8).filter方法還允許使用正則表達(dá)式(regular expression),通過(guò)regex參數(shù)搜索列。例如,我們可以搜索列名稱(chēng)中某處有數(shù)字的所有列。

          >>> movies.filter(regex=r"\d").head()
           actor_3_fb actor_2_name ... actor_3_name actor_2_fb
          0 855.0 Joel Dav... ... Wes Studi 936.0
          1 1000.0 Orlando ... ... Jack Dav... 5000.0
          2 161.0 Rory Kin... ... Stephani... 393.0
          3 23000.0 Christia... ... Joseph G... 23000.0
          4 NaN Rob Walker ... NaN 12.0

          原理解釋

          步驟(1)列出了所有不同數(shù)據(jù)類(lèi)型的頻率。或者也可以使用.dtypes屬性來(lái)獲取每一列的確切數(shù)據(jù)類(lèi)型。.select_dtypes方法可以在其include或exclude參數(shù)中接收一個(gè)列表或單個(gè)數(shù)據(jù)類(lèi)型,并返回僅具有給定數(shù)據(jù)類(lèi)型的列的DataFrame(如果使用的是exclude參數(shù),則返回一個(gè)不包含指定類(lèi)型的列的DataFrame)。列表值可以是數(shù)據(jù)類(lèi)型的字符串名稱(chēng),也可以是實(shí)際的Python對(duì)象。

          .filter方法僅通過(guò)檢查列名而不是實(shí)際數(shù)據(jù)值來(lái)選擇列。此外,.filter方法具有3個(gè)互斥的參數(shù),即item、like和regex,互斥意味著一次只能使用其中一個(gè)。

          like參數(shù)接收一個(gè)字符串,并嘗試查找名稱(chēng)中某處包含該確切字符串的所有列名稱(chēng)。為了獲得更大的靈活性,也可以使用regex參數(shù)來(lái)通過(guò)正則表達(dá)式選擇列名稱(chēng)。示例中  的特殊正則表達(dá)式r'\d' 表示0~9的所有數(shù)字,并且匹配其中至少包含一個(gè)數(shù)字的任何字符串。

          .filter方法還帶有另一個(gè)參數(shù),即items,該參數(shù)接收一個(gè)確切的列名稱(chēng)的列表。這幾乎是對(duì)索引操作的精確復(fù)制,只是如果其中一個(gè)字符串與列名稱(chēng)不匹配,則不會(huì)引發(fā)KeyError。例如,movies.filter(items = ['actor_1_name', 'asdf'])運(yùn)行時(shí)就不會(huì)出現(xiàn)錯(cuò)誤,并且將返回單列的DataFrame。

          擴(kuò)展知識(shí)

          .select_dtypes比較令人頭疼的地方是它的靈活性,因?yàn)樗梢酝瑫r(shí)接收字符串和Python對(duì)象。以下列表詳細(xì)闡釋了選擇許多不同列數(shù)據(jù)類(lèi)型的所有可能方法。在Pandas中并沒(méi)有引用數(shù)據(jù)類(lèi)型的標(biāo)準(zhǔn)或首選方法,因此你最好對(duì)這兩種方式均有所了解。

          • np.number、'number':選擇整數(shù)和浮點(diǎn)數(shù),而不考慮大小。
          • np.float64、np.float_、float、'float64'、'float_'、'float':僅選擇64位浮點(diǎn)值。
          • np.float16、np.float32、np.float128、'float16'、'float32'、'float128':分別選擇精確的16位、32位和128位浮點(diǎn)數(shù)。
          • np.floating、'floating':選擇所有浮點(diǎn)值,無(wú)論大小。
          • np.int0、np.int64、np.int_、int、'int0'、'int64'、'int _'、'int':僅選擇64位整數(shù)。
          • np.int8、np.int16、np.int32、'int8'、'int16'、'int32':分別選擇8位、16位和32位整數(shù)。
          • np.integer、'integer':選擇所有整數(shù),而不考慮大小。
          • 'Int64':選擇可為空的整數(shù);沒(méi)有NumPy等效項(xiàng)。
          • np.object、'object'、'O':選擇所有對(duì)象數(shù)據(jù)類(lèi)型。
          • np.datetime64、'datetime64'、'datetime':所有日期時(shí)間均為64位。
          • np.timedelta64、'timedelta64'、'timedelta':所有時(shí)間增量均為64位。
          • pd.Categorical、'category':Pandas特有分類(lèi);沒(méi)有NumPy等效項(xiàng)。

          由于所有整數(shù)和浮點(diǎn)數(shù)默認(rèn)為64位,因此可以使用字符串'int'或'float'來(lái)選擇它們。如果要選擇所有整數(shù)和浮點(diǎn)數(shù),而不管它們的具體大小如何,則可以使用字符串'number'。


          瀏覽 66
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费黄色毛片 | 日本三级少妇三级99夜在线观看 | 三级片小说| 久久婷婷综合激情 | 欧美黄A片视频 |