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

Pandas中的運算
Python 數(shù)據(jù)科學手冊(搶先版)
編者注:NumPy的重要特性之一是能夠執(zhí)行快速的元素級運算,既有基本的算術(加減乘除等),也有更為復雜的運算(三角函數(shù)、指數(shù)和對數(shù)等方法)。Pandas從NumPy繼承了這些功能中的大部分

NumPy的重要特性之一是能夠執(zhí)行快速的元素級運算,既有基本的算術(加減乘除等),也有更為復雜的運算(三角函數(shù)、指數(shù)和對數(shù)等方法)。Pandas從NumPy繼承了這些功能中的大部分,我們在第X.X節(jié)中介紹過的通用處理函數(shù)(universal functions簡稱ufuncs)是關鍵所在。

Pandas包含了一些有用的應變:對于像否運算以及三角函數(shù)這樣的一元運算,這些通用方法在輸出中會保留索引和列標簽。而對于加法和乘法這樣的二元運算來說,Pandas將會在對象傳到方法中的時候自動對齊索引。這意味著保留數(shù)據(jù)的上下文以及組合來自不同源的數(shù)據(jù)—這兩個在原始NumPy數(shù)組中容易出錯的任務,在Pandas中幾乎可以做到萬無一失。此外,我們還將看到Pandas包含非常好的可以在一維Series結構以及二維DataFrame結構之間進行的運算。

Ufuncs:索引保留

因為Pandas是被設計和NumPy一起工作的,任何NumPy的ufunc將都可以在Pandas Series對象和DataFrame對象上使用。我們從定義一個簡單的Series和DataFrame開始:

import pandas as pd
import numpy as np
rng = np.random.RandomState(42)
ser = pd.Series(rng.randint(0, 10, 4))
ser
df = pd.DataFrame(rng.randint(0, 10, (3, 4)),
 ? ? ? ? columns=['A', 'B', 'C', 'D'])
df

如果我們將一個NumPy通用函數(shù)應用到這些對象上,其結果將會是另外一個保留索引的Pandas對象:

np.exp(ser)

或者,對于一個稍微復雜的計算:

np.sin(df * np.pi / 4)

任何在第X.X節(jié)中討論過的通用函數(shù)都可以這樣使用。

Ufuncs:索引對齊

對于在兩個Series或者DataFrame之間進行的二元操作,Pandas將會在執(zhí)行操作的過程中將索引對齊。在處理不完整數(shù)據(jù)的時候,這是非常便捷的,正如我們下面的幾個例子所要展示的。

Series中的索引對齊

作為一個例子,假設我們正在組合兩個不同的數(shù)據(jù)源,并且發(fā)現(xiàn)只有美國面積排名前三的州和美國人口排名前三的州:

area = pd.Series({'Alaska': 1723337, 'Texas': 695662,
? ? ? ? ? ? ? 'California': 423967}, name='area')
population = pd.Series({'California': 38332521, 'Texas': 26448193,
? ? ? ? ? ? ? 'New York': 19651127}, name='population')

我們來看一下當我們將人口除以面積來計算人口密度是會發(fā)生什么:

population / area

結果數(shù)組包含了兩個輸入數(shù)組的索引并集,這可以通過使用標準的Python集合運算來得到:

area.index | population.index

任何在一個或者另一個數(shù)組中沒有輸入的項將會被標記成NaN(“Not a Number”,不是一個數(shù)字),Pandas就是這樣標記缺失數(shù)據(jù)的(更多的關于缺失數(shù)據(jù)處理的討論請看第X.X節(jié))。這一索引匹配對于任何Python內置算術表達式都是這樣實現(xiàn)的,任何缺失值默認將被NaN填充。

A = pd.Series([2, 4, 6], index=[0, 1, 2])
B = pd.Series([1, 3, 5], index=[1, 2, 3])
A + B

如果填充NaN值不是所期望的行為,那么填充的值可以被修改,只要使用恰當?shù)膶ο蠓椒▉泶娌僮鞣@?,調用A.add(B)?與調用A + B是等價的,但是前者允許可選的定義明確的填充值。

A.add(B, fill_value=0)

DataFrame中的索引對齊

當在DataFrame上執(zhí)行運算時,類似的對齊將同時發(fā)生在列和索引上:

A = pd.DataFrame(rng.randint(0, 20, (2, 2)),
 ? ? ? ? ? columns=list('AB'))
A
B = pd.DataFrame(rng.randint(0, 10, (3, 3)),
? ? ? ? columns=list('BAC'))

B
A + B

請注意,不論在兩個對象中的索引的排列順序如何,索引都可以正確對齊,并且在結果中索引是已排序的。與Series的情況相似,我們可以使用對象的運算方法并且傳遞任何想要的填充值來代替缺失的輸入:

A.add(B, fill_value=np.mean(A.values))

Python運算和與它們等價的Pandas對象方法的表格如下:

Operator

Pandas Method(s)

+

add()

sub(),?subtract()

*

mul(),?multiply()

/

truediv(),?div(),?divide()

//

floordiv()

%

mod()

**

pow()

Ufuncs:在DataFrame和Series之間的運算

當在一個DataFrame和一個Series之間執(zhí)行運算時,索引和列對齊也會被類似地處理。在一個DataFrame和一個Series對象之間的運算與二維和一維NumPy數(shù)組之間的運算類似。比如一個常見的運算,獲得一個二維數(shù)組和它其中一行之間的差集:

A = rng.randint(10, size=(3, 4))
A
A - A[0]

根據(jù)NumPy的傳播規(guī)則(參見第X.X節(jié)),在一個二維數(shù)組和它的一行之間的減運算是行級應用的。

在Pandas中,默認情況下是類似的,該運算也是行級的。

df = pd.DataFrame(A, columns=list('QRST'))
df - df.iloc[0]

如果你想要以列級的方式來運算,你可以使用上面提到的對象方法,指定軸關鍵字:

df.subtract(df['R'], axis=0)

請注意,這些DataFrame/Series運算,與上面討論過的運算一樣,將會自動對齊兩個元素中的索引。

halfrow = df.iloc[0, ::2]
half row
df – half row

這種索引及列的保留和對齊意味著在Pandas中對于數(shù)據(jù)的操作將總會維護數(shù)據(jù)的上下文,從而避免在處理原始NumPy數(shù)組里的異構數(shù)據(jù)時可能出現(xiàn)的各類愚蠢的錯誤。

總結

我們已經展示了標準的NumPy通用方法將會元素級地計算Pandas對象,并具有一些額外的有用的功能:它們保留索引名和列名,同時自動將不同的索引集合和列集合進行對齊。與我們在前面章節(jié)看到的基本索引和選擇運算類似,這些在Series和DataFrame上的元素級運算構成了許多更加復雜的數(shù)據(jù)處理實例的基石。這里要特別提一下索引的對齊操作,有時候會導致一些值在結果數(shù)組中是缺失的。下面一章我們將詳細討論Pandas是如何選擇處理這類缺失數(shù)據(jù)的。

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

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

Pandas operations