91精品国产综合久久四虎久久_国产成人午夜高潮毛片_99er视频精品免费观看_2020亚洲熟女在线观看_日本女优人体写真_国内黄色毛片_年轻的老师中文版在线_丰满女邻居做爰_久久久久久精品成人免费图片

Pandas中的對象簡介
Python 數(shù)據(jù)科學手冊(搶先版)

從本質(zhì)上來說,Pandas中的對象可以認為是NumPy中的結(jié)構(gòu)化數(shù)組的一個增強版本,其中的行和列是以標簽來標識的,而不是簡單的整數(shù)索引。正如我們將在本章的余下內(nèi)容中所看到的,Pandas在這些數(shù)據(jù)結(jié)構(gòu)之上提供了許多有用的工具、方法和功能,但是幾乎所有這些都建立在對于這些數(shù)據(jù)機構(gòu)的理解之上。第一節(jié)中將介紹三種基本的Pandas數(shù)據(jù)結(jié)構(gòu):Series、DataFrame和Index。

正如導入numpy的標準別名是np一樣,導入pandas的標準別名是pd

import numpy as np
import pandas as pd

Pandas?Series

Series是一個包含被索引的數(shù)據(jù)的一維的數(shù)組。它可以由如下的列表或者數(shù)組創(chuàng)建而成:

data = pd.Series([0.25, 0.5, 0.75, 1.0])
data

從上面的輸出我們可以看到,Series包含一組values?序列,以及一組index?序列,我們可以通過values?屬性和index?屬性來訪問。其中,values?是我們所熟悉的NumPy數(shù)組:

data.values

而index?是一個類似數(shù)組的pd.Index類型對象,我們將在后面討論其細節(jié)。

data.index

和NumPy數(shù)組相似,我們可以用Python的方括號表示法(在方括號中輸入數(shù)據(jù)所關(guān)聯(lián)的索引)來訪問數(shù)據(jù)。

data[1]
data[1:3]

下面我們將看到,Pandas Series比它所模擬的一維NumPy數(shù)據(jù)更加通用和靈活。

將Series視為泛化的NumPy數(shù)組

從我們目前所看到的,似乎Series對象基本上跟一個一維NumPy數(shù)組是可互相替換的。但其根本的不同在于索引的出現(xiàn):Numpy數(shù)組有一組隱式定義的整型索引用來訪問數(shù)據(jù),而Pandas Series有一組顯式定義的關(guān)聯(lián)到數(shù)據(jù)值的索引。

這一顯式索引為Series對象提供了額外的能力。例如,索引值不一定需要是一個整數(shù),而是可以由任何所需要的類型的值來組成。例如,如果我們愿意的話,我們可以用字符串來作為一個索引。

data = pd.Series([0.25, 0.5, 0.75, 1.0],
 ? ? ? ? ? ? ? ? ?  ? ?index=['a', 'b', 'c', 'd'])
data

這里數(shù)據(jù)訪問的結(jié)果會如你所想的那樣:

data['b']

我們甚至可以使用不連續(xù)的或者無序的索引

data = pd.Series([0.25, 0.5, 0.75, 1.0],
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? index=[2, 5, 3, 7])
data
data[5]

將Series視為特殊化的字典

以這種方式,你可以將Pandas Series理解為一個特殊化的Python字典。字典是一種將特定的鍵映射到特定的值的數(shù)據(jù)結(jié)構(gòu),而Series是將一種類型的鍵映射到一組某種類型的值上的數(shù)據(jù)結(jié)構(gòu)。這一類型化是重要的,正如NumPy數(shù)據(jù)背后基于特定類型編譯后的代碼使得它比Python列表在某些操作上更為高效,Pandas Series中的類型信息使得它比Python字典在某些操作上更為高效。

通過直接從一個Python字典來創(chuàng)建一個Series對象,可以使得Series與字典類比更為清晰。

population_dict = {'California': 38332521,
 ? ? ? ? ? ? ? 'Texas': 26448193,
 ? ? ? ? ? ? ? 'New York': 19651127,
     ? ? ? ? ? 'Florida': 19552860,
     ? ? ? ? ? 'Illinois': 12882135}
population = pd.Series(population_dict)
population

默認情況下,Series將字典的鍵排序后作為索引來建立。這里,典型的字典型項可以這樣訪問:

population['California']

與字典不同的是,Series也支持數(shù)組式的操作,比如切片。

population['California':'Illinois']

我們將在第X.X節(jié)討論一些Pandas中索引和切片的趣事。

構(gòu)造Series對象

我們已經(jīng)從一些例子中了解了一些構(gòu)造Pandas Series的方法。它們都是下面這個的一種版本,

>>> pd.Series(data, index=index)

其中index是可選的參數(shù),而data可以是許多實體中的一個。

例如,data可以是一個列表或者NumPy數(shù)組,其中index默認是一個整數(shù)序列

pd.Series([2, 4, 6])

data也可以是一個標量,該標量將會被用以填充所有給定的Index:

pd.Series(5, index=[100, 200, 300])

data可以是一個字典,其中默認的index是排序后的字典鍵:

pd.Series({2:'a', 1:'b', 3:'c'})

每一種情況中,如果你想要不同的結(jié)果,index都是可以顯式設(shè)定的:

pd.Series({2:'a', 1:'b', 3:'c'}, index=[3, 2])

請注意,這里我們明確指定了將要從所給的字典中包含到Series中的索引值。

Pandas?DataFrame

下一個我們要介紹的Pandas基本數(shù)據(jù)結(jié)構(gòu)是DataFram。與上面提到的Series類似,DataFrame也可以想象成一個NumPy數(shù)組的泛化或者是特殊化的Python字典。我們接下來將要討論這些看法。

將DataFrame視為一個泛化的NumPy數(shù)組

如果一個Series像是一個帶有靈活索引的一維數(shù)組,那么一個DataFrame就像是一個帶有靈活的行索引以及靈活的列名的二維數(shù)組。正如你可能認為一個二維數(shù)組是一個對齊的一維列的有序序列,你可以認為一個DataFrame是一個對齊的Series對象序列。這里,“對齊”我們指的是他們共享相同的索引。

為了展示這一概念,我們先來構(gòu)造一個新的Series,將之前提到過的五個州的面積列出來。

area_dict = {'California': 423967, 'Texas': 695662, 'New York': 141297, 'Florida': 170312, 'Illinois': 149995}
area = pd.Series(area_dict)
area

現(xiàn)在我們有了這個Series加上之前構(gòu)造的Series對象“population”?,我們可以用一個字典來構(gòu)造一個包含這些信息的二維對象:

states = pd.DataFrame({'population': population,
 ? ? 'area': area})
states

和Series對象類似,DataFrame也有一個index屬性,使得我們可以訪問到所有的index標簽:

states.index

此外,DataFrame還有一個columns屬性,這是一個包含了列標簽的Index對象

states.columns

由此,DataFrame可以被認為是一個二維NumPy數(shù)組的泛化,其中行和列都有泛化的索引可以訪問數(shù)據(jù)。

將DataFrame看做是一個特殊的字典

類似的,我們可以將一個DataFrame看做是一個特殊化的字典。字典將一個鍵映射到一個值,而DataFrame將一個列的名子映射到一個Series對象的列數(shù)據(jù)。例如,請求“area”屬性將返回我們上面所看到的包含面積的Series對象。

states['area']

這里有一點可能容易令人困惑:在一個二維的NumPy數(shù)組中,data[0]將返回第一行。而對于一個DataFrame來說,data[‘col0’]將會返回第一列。正因為如此,我們最好將DataFrame理解為泛化的字典而不是泛化的數(shù)組,盡管這兩種看法都是可行的。我們將在第X.X節(jié)中探索更加靈活的索引DataFrames的方法。

構(gòu)造DataFrame對象

一個Pandas DataFrame可以通過不同的方法來構(gòu)造,這里我們將給出幾個例子:

從單個Series對象構(gòu)造

一個DataFrame是一個Series對象的集合,并且一個單列的DataFrame可以由單個Series對象來構(gòu)造:

pd.DataFrame(population, columns=['population'])

從一個字典列表來構(gòu)造

任何字典列表都可以構(gòu)造一個DataFrame。我們將用一個簡單的列表來創(chuàng)建一些數(shù)據(jù)并構(gòu)造出DataFrame:

data = [{'a': i, 'b': 2 * i}
for i in range(3)]
pd.DataFrame(data)

即使字典中的一些鍵是缺失的,Pandas也會用NaN(也即“not a number”:不是一個數(shù)字)來進行填充:

pd.DataFrame([{'a': 1, 'b': 2}, {'b': 3, 'c': 4}])

從一個包含Series對象的字典來構(gòu)造

這一方法我們在之前已經(jīng)看到過了,一個DataFrame也可以從一個Series對象的字典來構(gòu)造。

pd.DataFrame({'population': population,
'area': area})

從一個二維NumPy數(shù)組來構(gòu)造

給定一個二維數(shù)組的數(shù)據(jù),我們可以創(chuàng)建一個包含任意指定列和索引名的DataFrame。如果,不指定的話,每列將是使用整型下標索引。

pd.DataFrame(np.random.rand(3, 2),
columns=['foo', 'bar'],
index=['a', 'b', 'c'])

從一個NumPy的結(jié)構(gòu)化數(shù)組構(gòu)造

我們在第X.X節(jié)中講過結(jié)構(gòu)化數(shù)組。一個Pandas DataFrame操作起來非常類似一個結(jié)構(gòu)化數(shù)據(jù),并且可以直接通過一個結(jié)構(gòu)化數(shù)組來構(gòu)造。

A = np.zeros(3, dtype=[('A', 'i8'), ('B', 'f8')])
A
pd.DataFrame(A)

Pandas?Index

上面我們看到了Series和DataFrame都包含了顯式的Index使得你可以引用和修改數(shù)據(jù)。這個Index對象本身是一個有趣的結(jié)構(gòu),并且它可以被看做是一個不變的數(shù)據(jù)或者是一個有序的不重復集合。這兩種看法對Index對象的可用操作有著很有趣的影響。作為一個簡單的例子,讓我們從一個整數(shù)列表來構(gòu)造一個Index:

ind = pd.Index([2, 3, 5, 7, 11])
ind

將Index看做不可變數(shù)組

Index中很多的操作與數(shù)組類似。例如,我們可以用標準的Python下標表示法來獲取值或者切片:

ind[1]
ind[::2]

Index對象也有許多在NumPy數(shù)組中我們熟知的屬性:

print(ind.size, ind.shape, ind.ndim, ind.dtype)

Index對象和NumPy數(shù)組的一個不同點是,Index是不可變的,也即通過一般的途徑是不能修改的。

ind[1] = 0

這種不可變性使得在多個DataFrame和數(shù)組之間共享Index更為安全,將不會有無意的Index修改所造成的潛在副作用。

將Index看做一個有序的集合

Pandas對象被設(shè)計成便于如數(shù)據(jù)集之間的連接等操作,這些操作都依賴于集合運算的許多方面。回想一下,我們在第X.X節(jié)中詳細介紹過,Python有一個內(nèi)置的集合對象。Index對象遵循了很多這一內(nèi)置集合對象的習慣用法,使得并、交、差以及其他組合運算能以熟悉的方法來計算:

indA = pd.Index([1, 3, 5, 7, 9])
indB = pd.Index([2, 3, 5, 7, 11])
indA & indB? # intersection
indA | indB? # union
indA - indB? # difference
indA ^ indB? # symmetric difference

這些操作也可以通過對象的方法來訪問,例如indA.intersection(indB)。至于更多關(guān)于Python中實現(xiàn)的各種集合操作的信息,請看第X.X節(jié)。那里列出的幾乎每一種語法,除了修改集合的之外,都能在Index對象上進行操作。

前瞻

上面我們介紹了Series、DataFrame以及Index的基本介紹,它們構(gòu)成了使用Pandas面向數(shù)據(jù)進行計算的基礎(chǔ)。我們看到了它們與其他Python數(shù)據(jù)結(jié)構(gòu)之間的異同點,以及它們可以怎樣從這些熟悉的對象中創(chuàng)建出來。通讀本章的內(nèi)容之后,我們將對這些數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建(包括非常有用的從各種文件類型創(chuàng)建它們的接口)以及在這些結(jié)構(gòu)上操作數(shù)據(jù)的細節(jié)做進一步的了解。正如了解如何有效地使用NumPy數(shù)組是在Python中高效進行數(shù)值計算的基礎(chǔ)一樣,理解如何有效地使用Pandas數(shù)據(jù)結(jié)構(gòu)是Python數(shù)據(jù)科學中所要求的數(shù)據(jù)整理步驟的基礎(chǔ)。

杰克?范德普拉斯(Jake VanderPlas)

杰克?范德普拉斯是Python科學計算組件的長期用戶和開發(fā)者。他現(xiàn)在是華盛頓大學跨學科研究主管,他主要進行他自己的天文學研究,并在各個領(lǐng)域為的科學家提供建議和咨詢。

Pandas table