<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 五、表格 > 原文:[Tables](https://github.com/data-8/textbook/tree/gh-pages/chapters/05) > 譯者:[飛龍](https://github.com/wizardforcel) > 協議:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/) > 自豪地采用[谷歌翻譯](https://translate.google.cn/) 表格是表示數據集的基本對象類型。 表格可以用兩種方式查看: + 具名列的序列,每列都描述數據集中所有條目的一個方面,或者 + 行的序列,每行都包含數據集中單個條目的所有信息。 為了使用表格,導入所有稱為`datascience`的模塊,這是為這篇文章創建的模塊。 ```py from datascience import * ``` 空表格可以使用`Table`創建。空表格是實用的,因為他可以擴展來包含新行和新列。 ```py Table() ``` 表格上的`with_columns`方法使用帶有附加標簽的列,構造一個新表。 表格的每一列都是一個數組。 為了將一個新列添加到表中,請使用標簽和數組調用`with_columns`。 (`with_column`方法具有相同的效果。) 下面,我們用一個沒有列的空表開始每個例子。 ```py Table().with_columns('Number of petals', make_array(8, 34, 5)) ``` | Number of petals | | --- | | 8 | | 34 | | 5 | 為了添加兩個(或更多)新列,請為每列提供一個數組和標簽。 所有列必須具有相同的長度,否則會發生錯誤。 ```py Table().with_columns( 'Number of petals', make_array(8, 34, 5), 'Name', make_array('lotus', 'sunflower', 'rose') ) ``` | Number of petals | Name | | --- | --- | | 8 | lotus | | 34 | sunflower | | 5 | rose | 我們可以給這個表格一個名詞,之后使用另外一列擴展表格。 ```py flowers = Table().with_columns( 'Number of petals', make_array(8, 34, 5), 'Name', make_array('lotus', 'sunflower', 'rose') ) flowers.with_columns( 'Color', make_array('pink', 'yellow', 'red') ) ``` | Number of petals | Name | Color | | --- | --- | --- | | 8 | lotus | pink | | 34 | sunflower | yellow | | 5 | rose | red | `with_columns`方法每次調用時,都會創建一個新表,所以原始表不受影響。 例如,表`an_example`仍然只有它創建時的兩列。 ``` flowers ``` | Number of petals | Name | | --- | --- | | 8 | lotus | | 34 | sunflower | | 5 | rose | 通過這種方式創建表涉及大量的輸入。 如果數據已經輸入到某個地方,通常可以使用 Python 將其讀入表格中,而不是逐個單元格地輸入。 通常,表格從包含逗號分隔值的文件創建。這些文件被稱為 CSV 文件。 下面,我們使用`Table`的`read_table`方法,來讀取一個 CSV 文件,它包含了一些數據,Minard 在他的拿破侖的俄羅斯戰役的圖片中使用。 數據放在名為`minard`的表中。 ``` minard = Table.read_table('minard.csv') minard ``` | Longitude | Latitude | City | Direction | Survivors | | --- | --- | --- | --- | --- | | 32 | 54.8 | Smolensk | Advance | 145000 | | 33.2 | 54.9 | Dorogobouge | Advance | 140000 | | 34.4 | 55.5 | Chjat | Advance | 127100 | | 37.6 | 55.8 | Moscou | Advance | 100000 | | 34.3 | 55.2 | Wixma | Retreat | 55000 | | 32 | 54.6 | Smolensk | Retreat | 24000 | | 30.4 | 54.4 | Orscha | Retreat | 20000 | | 26.8 | 54.3 | Moiodexno | Retreat | 12000 | 我們將使用這個小的表格來演示一些有用的表格方法。 然后,我們將使用這些相同的方法,并在更大的數據表上開發其他方法。 ### 表格的大小 `num_columns `方法提供了表中的列數量,`num_rows`是行數量。 ```py minard.num_columns 5 minard.num_rows 8 ``` ### 列標簽 `labels `方法可以用來列出所有列的標簽。 對于`minard`,并不是特別有用,但是對于那些非常大的表格,并不是所有的列都在屏幕上可見。 ```py minard.labels ('Longitude', 'Latitude', 'City', 'Direction', 'Survivors') ``` 我們使用`relabeled `修改列標簽。這會創建新的表格,并保留`minard`不變。 ``` minard.relabeled('City', 'City Name') ``` | Longitude | Latitude | City Name | Direction | Survivors | | --- | --- | --- | --- | --- | | 32 | 54.8 | Smolensk | Advance | 145000 | | 33.2 | 54.9 | Dorogobouge | Advance | 140000 | | 34.4 | 55.5 | Chjat | Advance | 127100 | | 37.6 | 55.8 | Moscou | Advance | 100000 | | 34.3 | 55.2 | Wixma | Retreat | 55000 | | 32 | 54.6 | Smolensk | Retreat | 24000 | | 30.4 | 54.4 | Orscha | Retreat | 20000 | | 26.8 | 54.3 | Moiodexno | Retreat | 12000 | 但是,這個方法并不修改原始表。 ``` minard ``` | Longitude | Latitude | City | Direction | Survivors | | --- | --- | --- | --- | --- | | 32 | 54.8 | Smolensk | Advance | 145000 | | 33.2 | 54.9 | Dorogobouge | Advance | 140000 | | 34.4 | 55.5 | Chjat | Advance | 127100 | | 37.6 | 55.8 | Moscou | Advance | 100000 | | 34.3 | 55.2 | Wixma | Retreat | 55000 | | 32 | 54.6 | Smolensk | Retreat | 24000 | | 30.4 | 54.4 | Orscha | Retreat | 20000 | | 26.8 | 54.3 | Moiodexno | Retreat | 12000 | 常見的模式時將原始名稱`minard`賦給新的表,以便`minard `未來的所有使用,都會引用修改標簽的表格。 ```py minard = minard.relabeled('City', 'City Name') minard ``` | Longitude | Latitude | City Name | Direction | Survivors | | --- | --- | --- | --- | --- | | 32 | 54.8 | Smolensk | Advance | 145000 | | 33.2 | 54.9 | Dorogobouge | Advance | 140000 | | 34.4 | 55.5 | Chjat | Advance | 127100 | | 37.6 | 55.8 | Moscou | Advance | 100000 | | 34.3 | 55.2 | Wixma | Retreat | 55000 | | 32 | 54.6 | Smolensk | Retreat | 24000 | | 30.4 | 54.4 | Orscha | Retreat | 20000 | | 26.8 | 54.3 | Moiodexno | Retreat | 12000 | ### 訪問列中的數據 我們可以使用列標簽來訪問列中的數據數組。 ```py minard.column('Survivors') array([145000, 140000, 127100, 100000, 55000, 24000, 20000, 12000]) ``` 五列的下標分別為`0, 1, 2, 3, 4`。`Survivors`列也可以使用列下標來訪問。 ```py minard.column(4) array([145000, 140000, 127100, 100000, 55000, 24000, 20000, 12000]) ``` 數組中的八個條目下標為`0, 1, 2, ..., 7`。列中的條目可以使用`item`訪問,就像任何數組那樣。 ```py minard.column(4).item(0) 145000 minard.column(4).item(5) 24000 ``` ### 處理列中的數據 因為列是數組,所以我們可以使用數組操作來探索新的信息。 例如,我們可以創建一個新列,其中包含 Smolensk 之后每個城市的所有幸存者的百分比。 ```py initial = minard.column('Survivors').item(0) minard = minard.with_columns( 'Percent Surviving', minard.column('Survivors')/initial ) minard ``` | Longitude | Latitude | City Name | Direction | Survivors | Percent Surviving | | --- | --- | --- | --- | --- | --- | | 32 | 54.8 | Smolensk | Advance | 145000 | 100.00% | | 33.2 | 54.9 | Dorogobouge | Advance | 140000 | 96.55% | | 34.4 | 55.5 | Chjat | Advance | 127100 | 87.66% | | 37.6 | 55.8 | Moscou | Advance | 100000 | 68.97% | | 34.3 | 55.2 | Wixma | Retreat | 55000 | 37.93% | | 32 | 54.6 | Smolensk | Retreat | 24000 | 16.55% | | 30.4 | 54.4 | Orscha | Retreat | 20000 | 13.79% | | 26.8 | 54.3 | Moiodexno | Retreat | 12000 | 8.28% | 要使新列中的比例顯示為百分比,我們可以使用選項`PercentFormatter`調用`set_format`方法。 `set_format`方法接受`Formatter `對象,存在日期(`DateFormatter`),貨幣(`CurrencyFormatter`),數字和百分比。 ```py minard.set_format('Percent Surviving', PercentFormatter) ``` | Longitude | Latitude | City Name | Direction | Survivors | Percent Surviving | | --- | --- | --- | --- | --- | --- | | 32 | 54.8 | Smolensk | Advance | 145000 | 100.00% | | 33.2 | 54.9 | Dorogobouge | Advance | 140000 | 96.55% | | 34.4 | 55.5 | Chjat | Advance | 127100 | 87.66% | | 37.6 | 55.8 | Moscou | Advance | 100000 | 68.97% | | 34.3 | 55.2 | Wixma | Retreat | 55000 | 37.93% | | 32 | 54.6 | Smolensk | Retreat | 24000 | 16.55% | | 30.4 | 54.4 | Orscha | Retreat | 20000 | 13.79% | | 26.8 | 54.3 | Moiodexno | Retreat | 12000 | 8.28% | ### 選擇列的集合 `select `方法創建一個新表,僅僅包含指定的列。 ```py minard.select('Longitude', 'Latitude') ``` | Longitude | Latitude | | --- | --- | | 32 | 54.8 | | 33.2 | 54.9 | | 34.4 | 55.5 | | 37.6 | 55.8 | | 34.3 | 55.2 | | 32 | 54.6 | | 30.4 | 54.4 | | 26.8 | 54.3 | 使用列索引而不是標簽,也可以執行相同選擇。 ```py minard.select(0, 1) ``` | Longitude | Latitude | | --- | --- | | 32 | 54.8 | | 33.2 | 54.9 | | 34.4 | 55.5 | | 37.6 | 55.8 | | 34.3 | 55.2 | | 32 | 54.6 | | 30.4 | 54.4 | | 26.8 | 54.3 | `select `的結果是個新表,即使當你選擇一列時也是這樣。 ``` minard.select('Survivors') ``` | Survivors | | --- | | 145000 | | 140000 | | 127100 | | 100000 | | 55000 | | 24000 | | 20000 | | 12000 | 要注意結果是個表格,不像`column`的結果,它是個數組。 ```py minard.column('Survivors') array([145000, 140000, 127100, 100000, 55000, 24000, 20000, 12000]) ``` 另一種創建新表,包含列集合的方式,是`drop`你不想要的列。 ```py minard.drop('Longitude', 'Latitude', 'Direction') ``` | City Name | Survivors | Percent Surviving | | --- | --- | --- | | Smolensk | 145000 | 100.00% | | Dorogobouge | 140000 | 96.55% | | Chjat | 127100 | 87.66% | | Moscou | 100000 | 68.97% | | Wixma | 55000 | 37.93% | | Smolensk | 24000 | 16.55% | | Orscha | 20000 | 13.79% | | Moiodexno | 12000 | 8.28% | `select `和`drop`都不修改原始表格。 相反,他們創建了共享相同數據的新小型表格。 保留的原始表格是實用的! 你可以生成多個不同的表格,只考慮某些列,而不用擔心會互相影響。 ``` minard ``` | Longitude | Latitude | City Name | Direction | Survivors | Percent Surviving | | --- | --- | --- | --- | --- | --- | | 32 | 54.8 | Smolensk | Advance | 145000 | 100.00% | | 33.2 | 54.9 | Dorogobouge | Advance | 140000 | 96.55% | | 34.4 | 55.5 | Chjat | Advance | 127100 | 87.66% | | 37.6 | 55.8 | Moscou | Advance | 100000 | 68.97% | | 34.3 | 55.2 | Wixma | Retreat | 55000 | 37.93% | | 32 | 54.6 | Smolensk | Retreat | 24000 | 16.55% | | 30.4 | 54.4 | Orscha | Retreat | 20000 | 13.79% | | 26.8 | 54.3 | Moiodexno | Retreat | 12000 | 8.28% | 我們用過的所有方法都可以用在任何表格上。 ## 對行排序 CNN 在 2016 年 3 月報道說:“NBA 是全球薪水最高的職業體育聯盟。”`nba_salaries`包含了 2015~2016 年間所有 NBA 球員的薪水。 每行表示一個球員。列為: | 列標簽 | 描述 | | --- | --- | | `PLAYER` | 球員名稱 | | `POSITION `| 球員在隊里的位置 | | `TEAM` | 隊的明確 | | `'15-'16 SALARY` | 2015~2016 年的球員薪水,單位是百萬美元。 | 位置代碼是 PG(控球后衛),SG(得分后衛),PF(大前鋒),SF(小前鋒)和 C(中鋒)。 但接下來的內容并不涉及籃球運動的細節。 第一行顯示,亞特蘭大老鷹隊(Atlanta Hawks)的大前鋒保羅·米爾薩普(Paul Millsap)在 2015~2016 年間的薪水接近 1870 萬美元。 ```py # This table can be found online: https://www.statcrunch.com/app/index.php?dataid=1843341 nba_salaries = Table.read_table('nba_salaries.csv') nba_salaries ``` | `PLAYER` | `POSITION` | `TEAM` | `'15-'16 SALARY` | | --- | --- | --- | --- | | Paul Millsap | PF | Atlanta Hawks | 18.6717 | | Al Horford | C | Atlanta Hawks | 12 | | Tiago Splitter | C | Atlanta Hawks | 9.75625 | | Jeff Teague | PG | Atlanta Hawks | 8 | | Kyle Korver | SG | Atlanta Hawks | 5.74648 | | Thabo Sefolosha | SF | Atlanta Hawks | 4 | | Mike Scott | PF | Atlanta Hawks | 3.33333 | | Kent Bazemore | SF | Atlanta Hawks | 2 | | Dennis Schroder | PG | Atlanta Hawks | 1.7634 | | Tim Hardaway Jr. | SG | Atlanta Hawks | 1.30452 | (省略了 407 行) 該表包含 417 行,每個球員一行。 只顯示了 10 行。`show`方法允許我們指定行數,缺省值(沒有指定)是表的所有行。 ```py nba_salaries.show(3) ``` | `PLAYER` | `POSITION` | `TEAM` | `'15-'16 SALARY` | | --- | --- | --- | --- | | Paul Millsap | PF | Atlanta Hawks | 18.6717 | | Al Horford | C | Atlanta Hawks | 12 | | Tiago Splitter | C | Atlanta Hawks | 9.75625 | (省略了 414 行) 通過瀏覽大約 20 行左右,你會看到行按字母順序排列。 也可以使用`sort`方法,按球員姓名的字母順序列出相同的行。 `sort`的參數是列標簽或索引。 ```py nba_salaries.sort('PLAYER').show(5) ``` | `PLAYER` | `POSITION` | `TEAM` | `'15-'16 SALARY` | | --- | --- | --- | --- | | Aaron Brooks | PG | Chicago Bulls | 2.25 | | Aaron Gordon | PF | Orlando Magic | 4.17168 | | Aaron Harrison | SG | Charlotte Hornets | 0.525093 | | Adreian Payne | PF | Minnesota Timberwolves | 1.93884 | | Al Horford | C | Atlanta Hawks | 12 | (省略了 412 行) 440/5000 為了檢查球員的薪水,如果數據是按薪水排序的話,會更有幫助。 為了實現它,我們首先簡化薪水列的標簽(只是為了方便),然后用新的標簽`SALARY`進行排序。 這會按照薪水的升序排列表中的所有行,最低的薪水在最前面。 輸出是一個新表,列與原始表格相同,但行是重新排列的。 ```py nba = nba_salaries.relabeled("'15-'16 SALARY", 'SALARY') nba.sort('SALARY') ``` | `PLAYER` | `POSITION` | `TEAM` | `'15-'16 SALARY` | | --- | --- | --- | --- | | Thanasis Antetokounmpo | SF | New York Knicks | 0.030888 | | Jordan McRae | SG | Phoenix Suns | 0.049709 | | Cory Jefferson | PF | Phoenix Suns | 0.049709 | | Elliot Williams | SG | Memphis Grizzlies | 0.055722 | | Orlando Johnson | SG | Phoenix Suns | 0.055722 | | Phil Pressey | PG | Phoenix Suns | 0.055722 | | Keith Appling | PG | Orlando Magic | 0.061776 | | Sean Kilpatrick | SG | Denver Nuggets | 0.099418 | | Erick Green | PG | Utah Jazz | 0.099418 | | Jeff Ayres | PF | Los Angeles Clippers | 0.111444 | (省略了 407 行) 這些數字有些難以比較,因為這些球員中的一些,在賽季中改變了球隊,并從不止一支球隊獲得了薪水。 只有最后一支球隊的薪水出現在表中。 控球后衛菲爾·普萊西(Phil Pressey)在年內從費城搬到了鳳凰城,可能會再次轉到金州勇士隊(Golden State Warriors)。 CNN 的報道是薪酬水平的另一端 - 那些在世界上薪水最高的球員。 為了按照薪水的降序對表格的行排序,我們必須以`descending=True`調用`sort`函數。 ```py nba.sort('SALARY', descending=True) ``` | `PLAYER` | `POSITION` | `TEAM` | `'15-'16 SALARY` | | --- | --- | --- | --- | | Kobe Bryant | SF | Los Angeles Lakers | 25 | | Joe Johnson | SF | Brooklyn Nets | 24.8949 | | LeBron James | SF | Cleveland Cavaliers | 22.9705 | | Carmelo Anthony | SF | New York Knicks | 22.875 | | Dwight Howard | C | Houston Rockets | 22.3594 | | Chris Bosh | PF | Miami Heat | 22.1927 | | Chris Paul | PG | Los Angeles Clippers | 21.4687 | | Kevin Durant | SF | Oklahoma City Thunder | 20.1586 | | Derrick Rose | PG | Chicago Bulls | 20.0931 | | Dwyane Wade | SG | Miami Heat | 20 | (省略了 407 行) 科比(Kobe Bryant)在湖人隊(Lakers)的最后一個賽季是薪水最高的,2500 萬美元。 請注意,MVP 斯蒂芬·庫里(Stephen Curry)并沒有出現在前 10 名之列。他排在后面,我們將在后面看到。 ### 具名參數 這個調用表達式的`descending = True`部分稱為具名參數。 調用一個函數或方法時,每個參數都有一個位置和一個名字。 從函數或方法的幫助文本中都可以看出它們。 ```py help(nba.sort) Help on method sort in module datascience.tables: sort(column_or_label, descending=False, distinct=False) method of datascience.tables.Table instance Return a Table of rows sorted according to the values in a column. Args: ``column_or_label``: the column whose values are used for sorting. ``descending``: if True, sorting will be in descending, rather than ascending order. ``distinct``: if True, repeated values in ``column_or_label`` will be omitted. Returns: An instance of ``Table`` containing rows sorted based on the values in ``column_or_label``. >>> marbles = Table().with_columns( ... "Color", make_array("Red", "Green", "Blue", "Red", "Green", "Green"), ... "Shape", make_array("Round", "Rectangular", "Rectangular", "Round", "Rectangular", "Round"), ... "Amount", make_array(4, 6, 12, 7, 9, 2), ... "Price", make_array(1.30, 1.30, 2.00, 1.75, 1.40, 1.00)) >>> marbles Color | Shape | Amount | Price Red | Round | 4 | 1.3 Green | Rectangular | 6 | 1.3 Blue | Rectangular | 12 | 2 Red | Round | 7 | 1.75 Green | Rectangular | 9 | 1.4 Green | Round | 2 | 1 >>> marbles.sort("Amount") Color | Shape | Amount | Price Green | Round | 2 | 1 Red | Round | 4 | 1.3 Green | Rectangular | 6 | 1.3 Red | Round | 7 | 1.75 Green | Rectangular | 9 | 1.4 Blue | Rectangular | 12 | 2 >>> marbles.sort("Amount", descending = True) Color | Shape | Amount | Price Blue | Rectangular | 12 | 2 Green | Rectangular | 9 | 1.4 Red | Round | 7 | 1.75 Green | Rectangular | 6 | 1.3 Red | Round | 4 | 1.3 Green | Round | 2 | 1 >>> marbles.sort(3) # the Price column Color | Shape | Amount | Price Green | Round | 2 | 1 Red | Round | 4 | 1.3 Green | Rectangular | 6 | 1.3 Green | Rectangular | 9 | 1.4 Red | Round | 7 | 1.75 Blue | Rectangular | 12 | 2 >>> marbles.sort(3, distinct = True) Color | Shape | Amount | Price Green | Round | 2 | 1 Red | Round | 4 | 1.3 Green | Rectangular | 9 | 1.4 Red | Round | 7 | 1.75 Blue | Rectangular | 12 | 2 ``` 在`help`文本的最上面,出現了`sort`方法的簽名。 ```py sort(column_or_label, descending=False, distinct=False) ``` 這描述了`sort`的三個參數的位置,名稱和默認值。 調用此方法時,可以使用位置參數或具名參數,因此以下三個調用完全相同。 ```py sort('SALARY', True) sort('SALARY', descending=True) sort(column_or_label='SALARY', descending=True) ``` 當一個參數只是`True`或`False`時,包含參數名稱是實用的約定,以便更明顯地說明參數值的含義。 ## 行的選取 通常,我們只想提取那些行,它們對應具有特定特征的條目。 例如,我們可能只需要對應勇士的行,或者獲得超過一千萬美元的球員。 或者我們可能只想要薪水前五名的人。 ### 指定行 `Table`的方法就是干這個的 - 它需要一組指定的行。 它的參數是行索引或索引數組,它創建一個只包含這些行的新表。 例如,如果我們只想要`nba`的第一行,我們可以這樣使用`take`。 ```py nba ``` | `PLAYER` | `POSITION` | `TEAM` | `'15-'16 SALARY` | | --- | --- | --- | --- | | Paul Millsap | PF | Atlanta Hawks | 18.6717 | | Al Horford | C | Atlanta Hawks | 12 | | Tiago Splitter | C | Atlanta Hawks | 9.75625 | | Jeff Teague | PG | Atlanta Hawks | 8 | | Kyle Korver | SG | Atlanta Hawks | 5.74648 | | Thabo Sefolosha | SF | Atlanta Hawks | 4 | | Mike Scott | PF | Atlanta Hawks | 3.33333 | | Kent Bazemore | SF | Atlanta Hawks | 2 | | Dennis Schroder | PG | Atlanta Hawks | 1.7634 | | Tim Hardaway Jr. | SG | Atlanta Hawks | 1.30452 | (省略了 407 行) ```py nba.take(0) ``` | `PLAYER` | `POSITION` | `TEAM` | `'15-'16 SALARY` | | --- | --- | --- | --- | | Paul Millsap | PF | Atlanta Hawks | 18.6717 | 這是一個新表,只擁有我們指定的單個行。 通過指定一系列索引作為參數,我們還可以獲得第四,第五和第六行。 ```py nba.take(np.arange(3, 6)) ``` | `PLAYER` | `POSITION` | `TEAM` | `'15-'16 SALARY` | | --- | --- | --- | --- | | Jeff Teague | PG | Atlanta Hawks | 8 | | Kyle Korver | SG | Atlanta Hawks | 5.74648 | | Thabo Sefolosha | SF | Atlanta Hawks | 4 | 如果我們想要前五個最高薪球員的表格,我們可以先按薪水排序,然后取前五行: ```py nba.sort('SALARY', descending=True).take(np.arange(5)) ``` | `PLAYER` | `POSITION` | `TEAM` | `'15-'16 SALARY` | | --- | --- | --- | --- | | Kobe Bryant | SF | Los Angeles Lakers | 25 | | Joe Johnson | SF | Brooklyn Nets | 24.8949 | | LeBron James | SF | Cleveland Cavaliers | 22.9705 | | Carmelo Anthony | SF | New York Knicks | 22.875 | | Dwight Howard | C | Houston Rockets | 22.3594 | ### 對應指定特征的行 更常見的情況是,我們打算訪問一組行中的數據,它們具有某種特征,但是我們并不知道其索引。 例如,我們可能想要所有薪水大于一千萬美元的球員的數據,但我們不希望花費時間,對已排序的表中的行進行計數。 `where`方法可以做到。 它的輸出是一個表格,列與原始表格相同,但只有特征出現的行。 `where`的第一個參數是列標簽,列中包含信息,有關某行是否具有我們想要的特征。 如果特征是“薪水超過一千萬美元”,那么列就是`SALARY`。 `where`的第二個參數是用于指定特征的方式。 一些例子會使指定的一般方式更容易理解。 在第一個例子中,我們提取了所有薪水超過一千萬美元的人的數據。 ```py nba.where('SALARY', are.above(10)) ``` | `PLAYER` | `POSITION` | `TEAM` | `'15-'16 SALARY` | | --- | --- | --- | --- | | Paul Millsap | PF | Atlanta Hawks | 18.6717 | | Al Horford | C | Atlanta Hawks | 12 | | Joe Johnson | SF | Brooklyn Nets | 24.8949 | | Thaddeus Young | PF | Brooklyn Nets | 11.236 | | Al Jefferson | C | Charlotte Hornets | 13.5 | | Nicolas Batum | SG | Charlotte Hornets | 13.1253 | | Kemba Walker | PG | Charlotte Hornets | 12 | | Derrick Rose | PG | Chicago Bulls | 20.0931 | | Jimmy Butler | SG | Chicago Bulls | 16.4075 | | Joakim Noah | C | Chicago Bulls | 13.4 | (省略了 59 行) `are.above(10)`的參數的確保了,每個選擇的行的`SALARY`大于 10。 新的表格有 69 行,相當于 69 個球員的薪水是一千萬美元。 按順序排列這些行使數據更易于分析。 多倫多猛龍隊(Toronto Raptors)的德瑪爾·德羅贊(DeMar DeRozan)是這個分組(薪水超過一千萬美元)中“最窮”的一個。 ```py nba.where('SALARY', are.above(10)).sort('SALARY') ``` | `PLAYER` | `POSITION` | `TEAM` | `'15-'16 SALARY` | | --- | --- | --- | --- | | DeMar DeRozan | SG | Toronto Raptors | 10.05 | | Gerald Wallace | SF | Philadelphia 76ers | 10.1059 | | Luol Deng | SF | Miami Heat | 10.1516 | | Monta Ellis | SG | Indiana Pacers | 10.3 | | Wilson Chandler | SF | Denver Nuggets | 10.4494 | | Brendan Haywood | C | Cleveland Cavaliers | 10.5225 | | Jrue Holiday | PG | New Orleans Pelicans | 10.5955 | | Tyreke Evans | SG | New Orleans Pelicans | 10.7346 | | Marcin Gortat | C | Washington Wizards | 11.2174 | | Thaddeus Young | PF | Brooklyn Nets | 11.236 | (省略了 59 行) 斯蒂芬·庫里(Stephen Curry)掙了多少? 對于答案,我們必須訪問`PLAYER`的值等于`Stephen Curry`的行。 這是一個只包含一行的表格: ```py nba.where('PLAYER', are.equal_to('Stephen Curry')) ``` | `PLAYER` | `POSITION` | `TEAM` | `'15-'16 SALARY` | | --- | --- | --- | --- | | Stephen Curry | PG | Golden State Warriors | 11.3708 | 庫里只有不到 1140 萬美元。 這是很多錢,但還不到勒布朗·詹姆斯(LeBron James)薪水的一半。 你可以在本節前面的“前 5 名”表中找到薪水,或者你可以在上面的代碼中找到它,將`'Stephen Curry`換成`'LeBron James'`。 代碼中再次使用了`are`,但這次是謂詞`equal_to`而不是上面那個。 因此,例如,你可以得到包含所有的勇士的表格: ```py nba.where('TEAM', are.equal_to('Golden State Warriors')).show() ``` | `PLAYER` | `POSITION` | `TEAM` | `'15-'16 SALARY` | | --- | --- | --- | --- | | Klay Thompson | SG | Golden State Warriors | 15.501 | | Draymond Green | PF | Golden State Warriors | 14.2609 | | Andrew Bogut | C | Golden State Warriors | 13.8 | | Andre Iguodala | SF | Golden State Warriors | 11.7105 | | Stephen Curry | PG | Golden State Warriors | 11.3708 | | Jason Thompson | PF | Golden State Warriors | 7.00847 | | Shaun Livingston | PG | Golden State Warriors | 5.54373 | | Harrison Barnes | SF | Golden State Warriors | 3.8734 | | Marreese Speights | C | Golden State Warriors | 3.815 | | Leandro Barbosa | SG | Golden State Warriors | 2.5 | | Festus Ezeli | C | Golden State Warriors | 2.00875 | | Brandon Rush | SF | Golden State Warriors | 1.27096 | | Kevon Looney | SF | Golden State Warriors | 1.13196 | | Anderson Varejao | PF | Golden State Warriors | 0.289755 | 這部分表格已經按薪水排序,因為原始的表格按薪水排序,列出了同一個球隊中球員。 行尾的`.show()`確保顯示所有行,而不僅僅是前 10 行。 請求某列等于某值的行非常普遍,因此`are.equal_to`調用是可選的。 相反,僅僅使用列名和值來調用`where`方法,以達到相同的效果。 ``` nba.where('TEAM', 'Denver Nuggets') # equivalent to nba.where('TEAM', are.equal_to('Denver Nuggets')) ``` | `PLAYER` | `POSITION` | `TEAM` | `'15-'16 SALARY` | | --- | --- | --- | --- | | Danilo Gallinari | SF | Denver Nuggets | 14 | | Kenneth Faried | PF | Denver Nuggets | 11.236 | | Wilson Chandler | SF | Denver Nuggets | 10.4494 | | JJ Hickson | C | Denver Nuggets | 5.6135 | | Jameer Nelson | PG | Denver Nuggets | 4.345 | | Will Barton | SF | Denver Nuggets | 3.53333 | | Emmanuel Mudiay | PG | Denver Nuggets | 3.10224 | | Darrell Arthur | PF | Denver Nuggets | 2.814 | | Jusuf Nurkic | C | Denver Nuggets | 1.842 | | Joffrey Lauvergne | C | Denver Nuggets | 1.70972 | (省略了 4 行) ### 多個屬性 通過重復使用`where`,你可以訪問具有多個指定特征的行。 例如,這是一種方法,提取薪水超過一千五百萬美元的所有控球后衛。 ```py nba.where('POSITION', 'PG').where('SALARY', are.above(15)) ``` | `PLAYER` | `POSITION` | `TEAM` | `'15-'16 SALARY` | | --- | --- | --- | --- | | Derrick Rose | PG | Chicago Bulls | 20.0931 | | Kyrie Irving | PG | Cleveland Cavaliers | 16.4075 | | Chris Paul | PG | Los Angeles Clippers | 21.4687 | | Russell Westbrook | PG | Oklahoma City Thunder | 16.7442 | | John Wall | PG | Washington Wizards | 15.852 | ### 一般形式 現在你已經意識到,通過選擇具有給定特征的行,來創建新表的一般方法,是使用`where`和`are`,以及適當的條件: ```py original_table_name.where(column_label_string, are.condition) nba.where('SALARY', are.between(10, 10.3)) ``` | `PLAYER` | `POSITION` | `TEAM` | `'15-'16 SALARY` | | --- | --- | --- | --- | | Luol Deng | SF | Miami Heat | 10.1516 | | Gerald Wallace | SF | Philadelphia 76ers | 10.1059 | | Danny Green | SG | San Antonio Spurs | 10 | | DeMar DeRozan | SG | Toronto Raptors | 10.05 | 請注意,上面的表格包括賺一千萬美元的 Danny Green,而不包括一千三百萬美元的 Monta Ellis。 與 Python 中的其他地方一樣,范圍包括左端但不包括右端。 如果我們指定一個任何行都不滿足的條件,我們得到一個帶有列標簽但沒有行的表。 ```py nba.where('PLAYER', are.equal_to('Barack Obama')) ``` | PLAYER | POSITION | TEAM | SALARY | | --- | --- | --- | --- | | | | | ### 更多條件 這里有一些謂詞,你可能會覺得有用。 請注意,`x`和`y`是數字,`STRING`是一個字符串,`Z`是數字或字符串;你必須指定這些,取決于你想要的特征。 | 謂詞 | 描述 | | --- | --- | | `are.equal_to(Z)` | 等于`Z` | | `are.above(x)` | 大于`x` | | `are.above_or_equal_to(x)` | 大于等于`x` | | `are.below(x)` | 小于`x` | | `are.below_or_equal_to(x)` | 小于等于`x` | | `are.between(x, y)` | 大于等于`x`,小于`y` | | `are.strictly_between(x, y)` | 大于`x`,小于`y` | | `are.between_or_equal_to(x, y)` | 大于等于`x`,小于等于`y` | | `are.containing(S)` | 包含字符串`S` | 你也可以指定任何這些條件的否定,通過在條件前面使用`.not_`。 | 謂詞 | 描述 | | --- | --- | | `are.not_equal_to(Z)` | 不等于`Z` | | `are.not_above(x)` | 不大于`x` | 以及其他。通常的邏輯規則是適用的,例如,“不大于`x`”等價于“小于等于`x`”。 我們以一系列示例結束這一節。 `are.containing`的使用有助于少打一些字。 例如,你可以指定`Warriors`而不是`Golden State Warriors`: ```py nba.where('TEAM', are.containing('Warriors')).show() ``` | `PLAYER` | `POSITION` | `TEAM` | `'15-'16 SALARY` | | --- | --- | --- | --- | | Klay Thompson | SG | Golden State Warriors | 15.501 | | Draymond Green | PF | Golden State Warriors | 14.2609 | | Andrew Bogut | C | Golden State Warriors | 13.8 | | Andre Iguodala | SF | Golden State Warriors | 11.7105 | | Stephen Curry | PG | Golden State Warriors | 11.3708 | | Jason Thompson | PF | Golden State Warriors | 7.00847 | | Shaun Livingston | PG | Golden State Warriors | 5.54373 | | Harrison Barnes | SF | Golden State Warriors | 3.8734 | | Marreese Speights | C | Golden State Warriors | 3.815 | | Leandro Barbosa | SG | Golden State Warriors | 2.5 | | Festus Ezeli | C | Golden State Warriors | 2.00875 | | Brandon Rush | SF | Golden State Warriors | 1.27096 | | Kevon Looney | SF | Golden State Warriors | 1.13196 | | Anderson Varejao | PF | Golden State Warriors | 0.289755 | 你可以提取所有后衛的數據,包括控球后衛和得分后衛。 ```py nba.where('POSITION', are.containing('G')) ``` | `PLAYER` | `POSITION` | `TEAM` | `'15-'16 SALARY` | | --- | --- | --- | --- | | Jeff Teague | PG | Atlanta Hawks | 8 | | Kyle Korver | SG | Atlanta Hawks | 5.74648 | | Dennis Schroder | PG | Atlanta Hawks | 1.7634 | | Tim Hardaway Jr. | SG | Atlanta Hawks | 1.30452 | | Jason Richardson | SG | Atlanta Hawks | 0.947276 | | Lamar Patterson | SG | Atlanta Hawks | 0.525093 | | Terran Petteway | SG | Atlanta Hawks | 0.525093 | | Avery Bradley | PG | Boston Celtics | 7.73034 | | Isaiah Thomas | PG | Boston Celtics | 6.91287 | | Marcus Smart | PG | Boston Celtics | 3.43104 | (省略了 171 行) 你可以獲取所有不是克利夫蘭騎士隊的球員,并且薪水不低于兩千萬美元: ```py other_than_Cavs = nba.where('TEAM', are.not_equal_to('Cleveland Cavaliers')) other_than_Cavs.where('SALARY', are.not_below(20)) ``` | `PLAYER` | `POSITION` | `TEAM` | `'15-'16 SALARY` | | --- | --- | --- | --- | | Joe Johnson | SF | Brooklyn Nets | 24.8949 | | Derrick Rose | PG | Chicago Bulls | 20.0931 | | Dwight Howard | C | Houston Rockets | 22.3594 | | Chris Paul | PG | Los Angeles Clippers | 21.4687 | | Kobe Bryant | SF | Los Angeles Lakers | 25 | | Chris Bosh | PF | Miami Heat | 22.1927 | | Dwyane Wade | SG | Miami Heat | 20 | | Carmelo Anthony | SF | New York Knicks | 22.875 | | Kevin Durant | SF | Oklahoma City Thunder | 20.1586 | 有很多方式可以創建相同的表格。這里是另一種,并且顯然你可以想出來更多。 ```py other_than_Cavs.where('SALARY', are.above_or_equal_to(20)) ``` | `PLAYER` | `POSITION` | `TEAM` | `'15-'16 SALARY` | | --- | --- | --- | --- | | Joe Johnson | SF | Brooklyn Nets | 24.8949 | | Derrick Rose | PG | Chicago Bulls | 20.0931 | | Dwight Howard | C | Houston Rockets | 22.3594 | | Chris Paul | PG | Los Angeles Clippers | 21.4687 | | Kobe Bryant | SF | Los Angeles Lakers | 25 | | Chris Bosh | PF | Miami Heat | 22.1927 | | Dwyane Wade | SG | Miami Heat | 20 | | Carmelo Anthony | SF | New York Knicks | 22.875 | | Kevin Durant | SF | Oklahoma City Thunder | 20.1586 | 你可以看到,`where`的使用提供了很大的靈活性,來訪問你感興趣的特征。 不要猶豫,嘗試它吧! ## 示例:人口趨勢 ### 美國人口的趨勢 現在我們做好了處理大量的數據表的準備。 下面的文件包含“美國居民人口的年度估計,按年齡和性別分列”。 請注意,`read_table`可以直接從 URL 讀取數據。 ```py # As of Jan 2017, this census file is online here: data = 'http://www2.census.gov/programs-surveys/popest/datasets/2010-2015/national/asrh/nc-est2015-agesex-res.csv' # A local copy can be accessed here in case census.gov moves the file: # data = 'nc-est2015-agesex-res.csv' full_census_table = Table.read_table(data) full_census_table ``` | SEX | AGE | CENSUS2010POP | ESTIMATESBASE2010 | POPESTIMATE2010 | POPESTIMATE2011 | POPESTIMATE2012 | POPESTIMATE2013 | POPESTIMATE2014 | POPESTIMATE2015 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | 0 | 0 | 3944153 | 3944160 | 3951330 | 3963087 | 3926540 | 3931141 | 3949775 | 3978038 | | 0 | 1 | 3978070 | 3978090 | 3957888 | 3966551 | 3977939 | 3942872 | 3949776 | 3968564 | | 0 | 2 | 4096929 | 4096939 | 4090862 | 3971565 | 3980095 | 3992720 | 3959664 | 3966583 | | 0 | 3 | 4119040 | 4119051 | 4111920 | 4102470 | 3983157 | 3992734 | 4007079 | 3974061 | | 0 | 4 | 4063170 | 4063186 | 4077551 | 4122294 | 4112849 | 3994449 | 4005716 | 4020035 | | 0 | 5 | 4056858 | 4056872 | 4064653 | 4087709 | 4132242 | 4123626 | 4006900 | 4018158 | | 0 | 6 | 4066381 | 4066412 | 4073013 | 4074993 | 4097605 | 4142916 | 4135930 | 4019207 | | 0 | 7 | 4030579 | 4030594 | 4043046 | 4083225 | 4084913 | 4108349 | 4155326 | 4148360 | | 0 | 8 | 4046486 | 4046497 | 4025604 | 4053203 | 4093177 | 4095711 | 4120903 | 4167887 | | 0 | 9 | 4148353 | 4148369 | 4125415 | 4035710 | 4063152 | 4104072 | 4108349 | 4133564 | (已省略 296 行) 只顯示了表格的前 10 行。稍后我們將看到如何顯示整個表格;但是,這通常不適用于大型表格。 表格的描述一起出現。`SEX`列包含數字代碼:`0`代表總體,`1代`表男性,`2`代表女性。 `AGE`列包含完整年份為單位的年齡,但特殊值`999`是人口的總和。 其余的列包含美國人口的估計。 通常,公共表格將包含更多的信息,不僅僅是特定調查或分析所需的信息。 在這種情況下,我們假設我們只對 2010 年到 2014 年的人口變化感興趣。讓我們選擇相關的列。 ```py partial_census_table = full_census_table.select('SEX', 'AGE', 'POPESTIMATE2010', 'POPESTIMATE2014') partial_census_table ``` | SEX | AGE | POPESTIMATE2010 | POPESTIMATE2014 | | --- | --- | --- | --- | | 0 | 0 | 3951330 | 3949775 | | 0 | 1 | 3957888 | 3949776 | | 0 | 2 | 4090862 | 3959664 | | 0 | 3 | 4111920 | 4007079 | | 0 | 4 | 4077551 | 4005716 | | 0 | 5 | 4064653 | 4006900 | | 0 | 6 | 4073013 | 4135930 | | 0 | 7 | 4043046 | 4155326 | | 0 | 8 | 4025604 | 4120903 | | 0 | 9 | 4125415 | 4108349 | (已省略 296 行) 我們也可以簡化所選列的標簽。 ```py us_pop = partial_census_table.relabeled('POPESTIMATE2010', '2010').relabeled('POPESTIMATE2014', '2014') us_pop ``` | SEX | AGE | 2010 | 2014 | | --- | --- | --- | --- | | 0 | 0 | 3951330 | 3949775 | | 0 | 1 | 3957888 | 3949776 | | 0 | 2 | 4090862 | 3959664 | | 0 | 3 | 4111920 | 4007079 | | 0 | 4 | 4077551 | 4005716 | | 0 | 5 | 4064653 | 4006900 | | 0 | 6 | 4073013 | 4135930 | | 0 | 7 | 4043046 | 4155326 | | 0 | 8 | 4025604 | 4120903 | | 0 | 9 | 4125415 | 4108349 | (已省略 296 行) 我們現在有了一個易于使用的表格。 表中的每一列都是一個等長的數組,因此列可以使用算術進行組合。 這是 2010 年至 2014 年的人口變化。 ```py us_pop.column('2014') - us_pop.column('2010') array([ -1555, -8112, -131198, ..., 6443, 12950, 4693244]) ``` 讓我們使用包含這些變化的列來擴展`us_pop`,一列是絕對數值,另一列是相對于 2010 年數值的百分比。 ```py change = us_pop.column('2014') - us_pop.column('2010') census = us_pop.with_columns( 'Change', change, 'Percent Change', change/us_pop.column('2010') ) census.set_format('Percent Change', PercentFormatter) ``` | SEX | AGE | 2010 | 2014 | Change | Percent Change | | --- | --- | --- | --- | --- | --- | | 0 | 0 | 3951330 | 3949775 | -1555 | -0.04% | | 0 | 1 | 3957888 | 3949776 | -8112 | -0.20% | | 0 | 2 | 4090862 | 3959664 | -131198 | -3.21% | | 0 | 3 | 4111920 | 4007079 | -104841 | -2.55% | | 0 | 4 | 4077551 | 4005716 | -71835 | -1.76% | | 0 | 5 | 4064653 | 4006900 | -57753 | -1.42% | | 0 | 6 | 4073013 | 4135930 | 62917 | 1.54% | | 0 | 7 | 4043046 | 4155326 | 112280 | 2.78% | | 0 | 8 | 4025604 | 4120903 | 95299 | 2.37% | | 0 | 9 | 4125415 | 4108349 | -17066 | -0.41% | (已省略 296 行) 將數據排序。讓我們按照人口絕對變化的降序排序表格。 ```py census.sort('Change', descending=True) ``` | SEX | AGE | 2010 | 2014 | Change | Percent Change | | --- | --- | --- | --- | --- | --- | | 0 | 999 | 309346863 | 318907401 | 9560538 | 3.09% | | 1 | 999 | 152088043 | 156955337 | 4867294 | 3.20% | | 2 | 999 | 157258820 | 161952064 | 4693244 | 2.98% | | 0 | 67 | 2693707 | 3485241 | 791534 | 29.38% | | 0 | 64 | 2706055 | 3487559 | 781504 | 28.88% | | 0 | 66 | 2621335 | 3347060 | 725725 | 27.69% | | 0 | 65 | 2678525 | 3382824 | 704299 | 26.29% | | 0 | 71 | 1953607 | 2519705 | 566098 | 28.98% | | 0 | 34 | 3822189 | 4364748 | 542559 | 14.19% | | 0 | 23 | 4217228 | 4702156 | 484928 | 11.50% | 毫不奇怪,排序后表格的第一行對應整個人口:所有年齡和性別的分組。 從 2010 年到 2014 年,美國人口增加了約 950 萬人,僅為 3%。 接下來的兩行分別對應所有的男性和所有的女性。 以絕對數量和百分比來衡量,男性人口的增長高于女性人口。 百分比變化都在 3% 左右。 現在看看接下來的幾行。 百分比變化從總人口的 3% 左右,上升到 60 年代末和 70 年代初的近 30%。 這個驚人的變化稱為美國的老齡化。 到目前為止,2014 年 64~67 歲年齡段的絕對變化最大。什么可以解釋這一大幅增長的原因? 我們可以通過考察相關分組的出生年份,來探索這個問題。 那些 2010 年在 64~67 歲年齡段的人,在 1943 年到 1946 年間出生。珍珠港的襲擊是在 1941 年底,美軍在 1942 年發動了一場大規模戰爭,結束于 1945 年。 2014 年 64 歲到 67 歲的人生于 1947 年到 1950 年,是美國二戰后的生育高峰。 戰后的生育高峰,是我們觀察到的巨大變化的主要原因。 ## 示例:性別趨勢 ### 性別比例的趨勢 我們現在擁有了足夠的編碼技能,足以檢查美國人群中的特征和趨勢。在這個例子中,我們將查看不同年齡的男性和女性的分布情況。我們將繼續使用上一節中的`us_pop`表。 ```py us_pop ``` | SEX | AGE | 2010 | 2014 | | --- | --- | --- | --- | | 0 | 0 | 3951330 | 3949775 | | 0 | 1 | 3957888 | 3949776 | | 0 | 2 | 4090862 | 3959664 | | 0 | 3 | 4111920 | 4007079 | | 0 | 4 | 4077551 | 4005716 | | 0 | 5 | 4064653 | 4006900 | | 0 | 6 | 4073013 | 4135930 | | 0 | 7 | 4043046 | 4155326 | | 0 | 8 | 4025604 | 4120903 | | 0 | 9 | 4125415 | 4108349 | (已省略 296 行) 我們從之前對這個數據集的檢查得知,表格的描述一起出現。 它提醒了表中包含的內容。 每一行表示一個年齡。`SEX`列包含數字代碼:`0`代表總數,`1`代表男性,`2`代表女性。 年齡欄包含以完整年份為單位的年齡,但特殊值`999`代表整個人口,不論年齡是什么。其余的列包含美國人口的估計。 ### 理解`AGE=100` 作為一個初步的例子,我們來解釋一下表中最后的年齡的數據,其中年齡是`100`歲。下面的代碼提取了男性和女性(性別代碼`0`)的組合分組,年齡最大的行。 ```py us_pop.where('SEX', are.equal_to(0)).where('AGE', are.between(97, 101)) ``` | SEX | AGE | 2010 | 2014 | | --- | --- | --- | --- | | 0 | 97 | 68893 | 83089 | | 0 | 98 | 47037 | 59726 | | 0 | 99 | 32178 | 41468 | | 0 | 100 | 54410 | 71626 | 不足為奇的是,年齡越大,人數越少,例如 99 歲的人數少于 98 歲。 然而,令人吃驚的是,100 歲的數值比 99 歲的數值要大得多。仔細查看文件,這是因為人口普查局使用 100 作為 100 或歲以上的每個人的代碼。 年齡為 100 歲的人不僅僅代表 100 歲的人,還包括年齡在 100 歲以上的人。這就是為什么那一行的數字大于 99 歲的人的數字。 ### 男性和女性的整體比例 我們現在開始考察 2014 年的性別比例。首先,我們一起來看看所有的年齡。 請記住,這意味著查看`AGE`編碼為`999`的行。`all_ages`表包含此信息。其中有三行:一個是兩種性別總體,一個是男性(`SEX`代碼為`1`),一個是女性(`SEX`代碼為`2`)。 ```py us_pop_2014 = us_pop.drop('2010') all_ages = us_pop_2014.where('AGE', are.equal_to(999)) all_ages ``` | SEX | AGE | 2014 | | --- | --- | --- | | 0 | 999 | 318907401 | | 1 | 999 | 156955337 | | 2 | 999 | 161952064 | `all_ages`的第 0 行包含兩年中每年的美國總人口。2014 年,美國人口剛剛少于 3.19 億。 第 1 行包含男性的計數,女性是第 2 行。 比較這兩行可以看到,在 2014 年,美國的女性比男性多。 第 1 行和第 2 行的人口數加起來為第 0 行的總人口數。 為了與其他數量進行比較,我們需要將這些數字轉換為總人口中的百分比。 讓我們訪問 2014 年的總數并命名。 然后,我們將顯示帶有比例列的人口表格。 與我們先前觀察到的,女性人數多于男性的情況一致,2014 年約有 50.8% 的人口是女性,兩年的每年中,約有 49.2% 的人口是男性。 ```py pop_2014 = all_ages.column('2014').item(0) all_ages.with_column( 'Proportion', all_ages.column('2014')/pop_2014 ).set_format('Proportion', PercentFormatter) ``` | SEX | AGE | 2014 | Proportion | | --- | --- | --- | --- | | 0 | 999 | 318907401 | 100.00% | | 1 | 999 | 156955337 | 49.22% | | 2 | 999 | 161952064 | 50.78% | ### 新生兒中男孩和女孩的比例 但是,當我們查看嬰兒時,情況正好相反。 讓我們將嬰兒定義為還沒有完整一年的人,對應年齡為 0 的行。這里是他們的人口數量。 你可以看到男嬰比女嬰多。 ```py infants = us_pop_2014.where('AGE', are.equal_to(0)) infants ``` | SEX | AGE | 2014 | | --- | --- | --- | | 0 | 0 | 3949775 | | 1 | 0 | 2020326 | | 2 | 0 | 1929449 | 像以前一樣,我們可以將這些數字轉換成嬰兒總數中的百分比。 所得表格顯示,2014 年,美國超過 51% 的嬰兒是男性。 ```py infants_2014 = infants.column('2014').item(0) infants.with_column( 'Proportion', infants.column('2014')/infants_2014 ).set_format('Proportion', PercentFormatter) ``` | SEX | AGE | 2014 | Proportion | | --- | --- | --- | --- | | 0 | 0 | 3949775 | 100.00% | | 1 | 0 | 2020326 | 51.15% | | 2 | 0 | 1929449 | 48.85% | 事實上,長期以來,新生兒中男孩的比例略高于 1/2。 這個原因還沒有得到徹底的理解,[科學家們還在努力](http://www.npr.org/sections/health-shots/2015/03/30/396384911/why-are-more-baby-boys-born-than-girls)。 ### 每個年齡的男女比例 我們已經看到,雖然男嬰比女嬰多,但女性總數比男性多。 所以很顯然,性別之間的分隔在不同年齡之間必須有所不同。 為了研究這個變化,我們將女性和男性的數據分開,并消除所有年齡的組合,年齡編碼為 999 的行。 `females`和`male`表格分別包含兩個性別的數據。 ```py females_all_rows = us_pop_2014.where('SEX', are.equal_to(2)) females = females_all_rows.where('AGE', are.not_equal_to(999)) females ``` | SEX | AGE | 2014 | | --- | --- | --- | | 2 | 0 | 1929449 | | 2 | 1 | 1931375 | | 2 | 2 | 1935991 | | 2 | 3 | 1957483 | | 2 | 4 | 1961199 | | 2 | 5 | 1962561 | | 2 | 6 | 2024870 | | 2 | 7 | 2032494 | | 2 | 8 | 2015285 | | 2 | 9 | 2010659 | (省略了 91 行) ```py males_all_rows = us_pop_2014.where('SEX', are.equal_to(1)) males = males_all_rows.where('AGE', are.not_equal_to(999)) males ``` | SEX | AGE | 2014 | | --- | --- | --- | | 1 | 0 | 2020326 | | 1 | 1 | 2018401 | | 1 | 2 | 2023673 | | 1 | 3 | 2049596 | | 1 | 4 | 2044517 | | 1 | 5 | 2044339 | | 1 | 6 | 2111060 | | 1 | 7 | 2122832 | | 1 | 8 | 2105618 | | 1 | 9 | 2097690 | (省略了 91 行) 現在的計劃是,比較兩年中每一年的,每個年齡的女性人數和男性人數。 數組和表格的方法為我們提供了直接的方式。 這兩個表格中,每個年齡都有一行。 ```py males.column('AGE') array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]) females.column('AGE') array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]) ``` 對于任何特定年齡,我們都可以通過將女性人數除以男性人數,獲的女性:男性性別比例。 為了一步完成它,我們可以使用列來提取女性數量的數組,和相應的男性數量的數組,然后簡單地將一個數組除以另一個數組。 逐元素相除將為所有年份創建性別比例的數組。 ```py ratios = Table().with_columns( 'AGE', females.column('AGE'), '2014 F:M RATIO', females.column('2014')/males.column('2014') ) ratios ``` | AGE | 2014 F:M RATIO | | --- | --- | | 0 | 0.955019 | | 1 | 0.956884 | | 2 | 0.956672 | | 3 | 0.955058 | | 4 | 0.959248 | | 5 | 0.959998 | | 6 | 0.959172 | | 7 | 0.957445 | | 8 | 0.957099 | | 9 | 0.958511 | (省略了 91 行) 從輸出中可以看出,九歲以下兒童的比例都在 0.96 左右。 當男女比例小于 1 時,女性比男性少。 因此,我們所看到的是,在 0~9 歲的年齡段中,女孩比男孩少。此外,在每個年齡中,每 100 個男孩大約對應 96 個女孩。 那么人口中女性的整體比例為什么高于男性呢? 當我們檢查年齡的另一端時,會發現一些非同尋常的事情。 以下是 75 歲以上的男女比例。 ```py ratios.where('AGE', are.above(75)).show() ``` | AGE | 2014 F:M RATIO | | --- | --- | | 76 | 1.23487 | | 77 | 1.25797 | | 78 | 1.28244 | | 79 | 1.31627 | | 80 | 1.34138 | | 81 | 1.37967 | | 82 | 1.41932 | | 83 | 1.46552 | | 84 | 1.52048 | | 85 | 1.5756 | | 86 | 1.65096 | | 87 | 1.72172 | | 88 | 1.81223 | | 89 | 1.91837 | | 90 | 2.01263 | | 91 | 2.09488 | | 92 | 2.2299 | | 93 | 2.33359 | | 94 | 2.52285 | | 95 | 2.67253 | | 96 | 2.87998 | | 97 | 3.09104 | | 98 | 3.41826 | | 99 | 3.63278 | | 100 | 4.25966 | 不僅所有這些比例大于 1,在所有這些年齡段中,女性比男性多,其中許多比例大于 1。 + 在 89 歲和 90 歲中,比例接近 2,這意味著 2014 年這些年齡的女性約為男性的兩倍。 + 在 98 歲和 99 歲中,女性約為男性的 3.5 至 4 倍。 如果你想知道有多少高齡的人,你可以使用 Python 來發現: ```py males.where('AGE', are.between(98, 100)) ``` | SEX | AGE | 2014 | | --- | --- | --- | | 1 | 98 | 13518 | | 1 | 99 | 8951 | ``` females.where('AGE', are.between(98, 100)) ``` | SEX | AGE | 2014 | | --- | --- | --- | | 2 | 98 | 46208 | | 2 | 99 | 32517 | 下圖展示了年齡相關的性別比率。 藍色曲線顯示 2014 年的比例與年齡。 從 0 歲到 60 歲,這個比例差不多是 1(表示男性和女性差不多相等),但從 65 歲開始,比例開始急劇上升(女性多于男性)。 美國女性人數多于男性,部分原因是老年婦女的顯著的性別不平衡。 ```py ratios.plot('AGE') ``` ![](https://box.kancloud.cn/809831fdd201da2ab0aac50c31960e6f_566x375.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看