Pandas學習筆記

Pandas是一個Python包,提供快速、靈活和富有表現力的數據結構,使關聯或標記數據的使用既簡單又直觀。html

它旨在成爲Python中進行實際,真實世界數據分析的基礎高級構建塊。這次外還有更普遍的目標,即稱爲任何語言中最強大,最靈活的開源數據分析/操做工具。數組

適合許多不一樣類型的數據數據結構

  • 具備異構類型列的表格數據,如SQL表或Excel表
  • 有序和無序的時間序列數據
  • 具備行和列標籤的任意矩陣數據
  • 任何其餘形式的觀察/統計數據集。實際上不須要將數據標記爲放置在pandas數據結構中

主要數據結構是Series(一維)和DataFrame(二維)處理金融,統計,社會科學和許多工程領域中的絕大多數典型用例。Pandas創建在NumPy之上,與許多其餘第三方庫完美集成。dom

數據結構

數據對齊是固有的函數

  • import numpy as np
  • import pandas as pd
  • import matplotlib.pyplot as plt

Series是一維標記的數組,可以保存任何數據類型。軸標籤統稱爲索引,建立系列的基本方法是調用工具

  • s = pd.Series(data,index=index)

data能夠有不少不一樣的東西,好比spa

  • 一個Python字典
  • 一個ndarray
  • 標量 

傳遞的索引是軸標籤列表。所以根據數據的不一樣,能夠分爲幾種狀況code

來自ndarrayhtm

若是data是ndarray,則索引的長度必須與數據的長度相同。若是沒有傳遞索引,將建立一個具備值的索引對象

pd.Series(np.random.rand(5))

來自dict

能夠從dicts實例化

pd.Series({'b':1}) 

來自標量值

若是data是標量值,則必須提供索引。將重複該值以匹配索引的長度

pd.Series(5.,index=['a','b']) 

index是行索引,columns是列索引

能夠對Series進行計算和切片等操做

系列也能夠有一個name屬性

s = pd.Series(np.random.randn(5),name='something')

DataFrame是一個二維標記數據結構,具備可能不一樣類型的列。能夠將其視爲電子表格或SQL表,或Series對象的字段。一般是最經常使用的pandas對象。接受不一樣類型的輸入

  • 1D ndarray,list,dicts或Series的Dict
  • 二維numpy.ndarray
  • 結構化或記錄ndarray
  • 一個Series
  • 另外一個DataFrame

除了數據,還能夠傳遞索引(行標籤)和列(列標籤)參數。若是傳遞索引和/或列,則能夠保證生成的DataFrame的索引和/或列。

來自dict或Series的dicts

獲得的指數將是各類系列的指標。若是有任何嵌套的dicts,將首先轉換爲Series。

In [34]: d = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']), ....: 'two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])} ....: In [35]: df = pd.DataFrame(d) In [36]: df Out[36]: one two a 1.0  1.0 b 2.0  2.0 c 3.0  3.0 d NaN 4.0 In [37]: pd.DataFrame(d, index=['d', 'b', 'a']) Out[37]: one two d NaN 4.0 b 2.0  2.0 a 1.0  1.0 In [38]: pd.DataFrame(d, index=['d', 'b', 'a'], columns=['two', 'three']) Out[38]: two three d 4.0 NaN b 2.0 NaN a 1.0   NaN

經過訪問索引和列數據,能夠分別訪問行和列標籤

In [39]: df.index Out[39]: Index(['a', 'b', 'c', 'd'], dtype='object') In [40]: df.columns Out[40]: Index(['one', 'two'], dtype='object')

來自ndarrays 、lists的字典

ndarrays必須都是相同的長度。若是傳遞索引,則它必須明顯與數組的長度相同。若是沒有傳遞索引,結果將是range(n)

In [41]: d = {'one' : [1., 2., 3., 4.], ....: 'two' : [4., 3., 2., 1.]} ....: In [42]: pd.DataFrame(d) Out[42]: one two 0  1.0  4.0
1  2.0  3.0
2  3.0  2.0
3  4.0  1.0 In [43]: pd.DataFrame(d, index=['a', 'b', 'c', 'd']) Out[43]: one two a 1.0  4.0 b 2.0  3.0 c 3.0  2.0 d 4.0  1.0

來自structrued或record array

處理方式與數組的字段相同

In [44]: data = np.zeros((2,), dtype=[('A', 'i4'),('B', 'f4'),('C', 'a10')]) In [45]: data[:] = [(1,2.,'Hello'), (2,3.,"World")] In [46]: pd.DataFrame(data) Out[46]: A B C 0  1  2.0  b'Hello'
1  2  3.0  b'World' In [47]: pd.DataFrame(data, index=['first', 'second']) Out[47]: A B C first 1  2.0  b'Hello' second 2  3.0  b'World' In [48]: pd.DataFrame(data, columns=['C', 'A', 'B']) Out[48]: C A B 0  b'Hello'  1  2.0
1  b'World'  2  3.0

來自dicts列表

In [49]: data2 = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}] In [50]: pd.DataFrame(data2) Out[50]: a b c 0  1   2 NaN 1  5  10  20.0 In [51]: pd.DataFrame(data2, index=['first', 'second']) Out[51]: a b c first 1   2 NaN second 5  10  20.0 In [52]: pd.DataFrame(data2, columns=['a', 'b']) Out[52]: a b 0  1   2
1  5  10

來自元組

In [53]: pd.DataFrame({('a', 'b'): {('A', 'B'): 1, ('A', 'C'): 2}, ....: ('a', 'a'): {('A', 'C'): 3, ('A', 'B'): 4}, ....: ('a', 'c'): {('A', 'B'): 5, ('A', 'C'): 6}, ....: ('b', 'a'): {('A', 'C'): 7, ('A', 'B'): 8}, ....: ('b', 'b'): {('A', 'D'): 9, ('A', 'B'): 10}}) ....: Out[53]: a b b a c a b A B 1.0  4.0  5.0  8.0  10.0 C 2.0  3.0  6.0  7.0 NaN D NaN NaN NaN NaN 9.0

構造函數

DataFrame.from_dict採用dicts的dict或相似數組序列的dict並返回DataFrame。DataFrame除了默認狀況下的orient參數外,它的操做相似於構造函數columns,但能夠將其設置index爲使用dict鍵做爲行標籤

In [54]: pd.DataFrame.from_dict(dict([('A', [1, 2, 3]), ('B', [4, 5, 6])])) Out[54]: A B 0  1  4
1  2  5
2  3  6

若是設置orient='index',則鍵將是行標籤。還能夠傳遞所需的列名稱

In [55]: pd.DataFrame.from_dict(dict([('A', [1, 2, 3]), ('B', [4, 5, 6])]), ....: orient='index', columns=['one', 'two', 'three']) ....: Out[55]: one two three A 1    2      3 B 4    5      6

DataFrame.from_record獲取元組列表或帶有結構化dtype的ndarray。相似於普通DataFrame構造函數,但生產的DataFrame索引多是結構化dtype的特定字段

In [57]: pd.DataFrame.from_records(data, index='C') Out[57]: A B C b'Hello'  1  2.0 b'World'  2  3.0

列選擇、添加、刪除

能夠將DataFrame視爲相似索引的Series對象的dict。獲取,設置和刪除的工做方式與dict操做相同

In [58]: df['one'] Out[58]: a 1.0 b 2.0 c 3.0 d NaN Name: one, dtype: float64 In [59]: df['three'] = df['one'] * df['two'] In [60]: df['flag'] = df['one'] > 2 In [61]: df Out[61]: one two three flag a 1.0  1.0    1.0 False b 2.0  2.0    4.0 False c 3.0  3.0    9.0 True d NaN 4.0    NaN  False

刪除

In [62]: del df['two'] In [63]: three = df.pop('three') In [64]: df Out[64]: one flag a 1.0 False b 2.0 False c 3.0 True d NaN False

插入

In [65]: df['foo'] = 'bar' In [66]: df Out[66]: one flag foo a 1.0 False bar b 2.0 False bar c 3.0 True bar d NaN False bar

若是插入與DataFrame不具備相同索引的Series時,將符合DataFrame的索引

In [67]: df['one_trunc'] = df['one'][:2] In [68]: df Out[68]: one flag foo one_trunc a 1.0  False  bar        1.0 b 2.0  False  bar        2.0 c 3.0 True bar NaN d NaN False bar NaN

能夠插入原始的ndarrays,但他們的長度必須與DataFrame索引的長度相匹配

默認狀況下,列會在末尾插入。該insert函數能夠用於插入列的特定位置

In [69]: df.insert(1, 'bar', df['one']) In [70]: df Out[70]: one bar flag foo one_trunc a 1.0  1.0  False  bar        1.0 b 2.0  2.0  False  bar        2.0 c 3.0  3.0 True bar NaN d NaN NaN False bar NaN

在方法鏈中分配新列

DataFrame有一種assign()方法能夠建立從現有列派生的新列

In [71]: iris = pd.read_csv('data/iris.data') In [72]: iris.head() Out[72]: SepalLength SepalWidth PetalLength PetalWidth Name 0          5.1         3.5          1.4         0.2  Iris-setosa 1          4.9         3.0          1.4         0.2  Iris-setosa 2          4.7         3.2          1.3         0.2  Iris-setosa 3          4.6         3.1          1.5         0.2  Iris-setosa 4          5.0         3.6          1.4         0.2  Iris-setosa In [73]: (iris.assign(sepal_ratio = iris['SepalWidth'] / iris['SepalLength']) ....: .head()) ....: Out[73]: SepalLength SepalWidth PetalLength PetalWidth Name sepal_ratio 0          5.1         3.5          1.4         0.2  Iris-setosa       0.6863
1          4.9         3.0          1.4         0.2  Iris-setosa       0.6122
2          4.7         3.2          1.3         0.2  Iris-setosa       0.6809
3          4.6         3.1          1.5         0.2  Iris-setosa       0.6739
4          5.0         3.6          1.4         0.2  Iris-setosa       0.7200

咱們插入了一個預先計算的值,還能夠傳入一個參數的函數,以便在分配給DataFrame上進行求值

In [74]: iris.assign(sepal_ratio = lambda x: (x['SepalWidth'] / ....: x['SepalLength'])).head() ....: Out[74]: SepalLength SepalWidth PetalLength PetalWidth Name sepal_ratio 0          5.1         3.5          1.4         0.2  Iris-setosa       0.6863
1          4.9         3.0          1.4         0.2  Iris-setosa       0.6122
2          4.7         3.2          1.3         0.2  Iris-setosa       0.6809
3          4.6         3.1          1.5         0.2  Iris-setosa       0.6739
4          5.0         3.6          1.4         0.2  Iris-setosa       0.7200

assign始終返回數據的副本,保持原始DataFrame不變

當沒有引用DataFrame時,傳遞可調用的,而不是要插入的實際值。這assign在操做鏈中使用時很常見

In [75]: (iris.query('SepalLength > 5') ....: .assign(SepalRatio = lambda x: x.SepalWidth / x.SepalLength, ....: PetalRatio = lambda x: x.PetalWidth / x.PetalLength) ....: .plot(kind='scatter', x='SepalRatio', y='PetalRatio'))

索引選擇

選擇列:df[col]:系列

按標籤選擇行:df.loc[label]:系列

按整數位置選擇行:df.iloc[loc]:系列

切片行:df[5:10]:數據幀

按布爾向量選擇行:df[bool_vec]:數據幀

數據對齊和算術

DataFrame對象之間的數據對其自動在列和索引(行標籤)上對齊。一樣生成的對象具備列和行標籤的並集

In [82]: df = pd.DataFrame(np.random.randn(10, 4), columns=['A', 'B', 'C', 'D']) In [83]: df2 = pd.DataFrame(np.random.randn(7, 3), columns=['A', 'B', 'C']) In [84]: df + df2 Out[84]: A B C D 0  0.0457 -0.0141  1.3809 NaN 1 -0.9554 -1.5010  0.0372 NaN 2 -0.6627  1.5348 -0.8597 NaN 3 -2.4529  1.2373 -0.1337 NaN

DataFrame和Series之間執行操做時,默認行爲是在DataFrame列上對齊Series索引,從而按行進行廣播

df - df.iloc[0]

 在使用時間序列數據的特殊狀況下,DataFrame索引還包含日期,廣播將按列進行

index = pd.date_range('1/1/2000', periods=8)
df = pd.DataFrame(np.random.randn(8, 3), index=index, columns=list('ABC'))
df*5+2
1/df
df ** 4
df1 & df2
df1 | df2
df1 ^ df2
-df1

轉置

要進行轉置,須要訪問T屬性,相似於ndarray

df[:5].T

DataFrame與NumPy函數的互操做性

能夠在DataFrame上使用其餘的Numpy函數

np.exp(df)

np.asarray(df)

df.T.dot(df)

DataFrame列屬性訪問

若是DataFrame列標籤是有效的Python變量名稱,則能夠像屬性同樣訪問

df.A

基本功能

要查看Series或DataFrame對象的小樣本,請使用head()和tail()方法。顯示的默認元素數爲5,但您能夠傳遞自定義數字。

long_series = pd.Series(np.random.randn(100))

long_series.head() //查看頭

long_series.tail(3) //查看末尾

屬性和原始ndarray(s)

df.columns = [x.lower() for x in df.columns] //列名小寫

df.values 訪問實際數據

加速操做

pandas支持使用numexpr庫和bottleneck庫加速某些類型的二進制數值和布爾運算

pd.set_option('compute.use_bottleneck', False) pd.set_option('compute.use_numexpr', False)

匹配和廣播

數據框所擁有的方法add(),sub(),mul(),div()和相關的功能radd(),rsub()用於執行二進制運算。

對於廣播行爲,系列輸入是主要關注點。能夠經過axis關鍵字匹配索引或列。

填充值數據的操做

算術函數能夠選擇輸入fill_value,即當缺乏某個位置時須要替換的值。

df.add(df2,fill_value=0)

布爾縮減

能夠使用empty,any(),all,bool()提供一種方法來歸納一個布爾結果

  • (df>0).all()
  • (df>0).any()
  • df.empty

比較對象是否相等

df+df != df*2 這個表達式是錯誤的 

(df+df).equals(df*2) 應該使用這個表達式

比較相似數組的對象

pandas數據結構與標量值進行比較時,能夠用下面方式執行元素比較 

In [64]: pd.Series(['foo', 'bar', 'baz']) == 'foo' Out[64]: 0 True 1 False 2 False dtype: bool In [65]: pd.Index(['foo', 'bar', 'baz']) == 'foo' Out[65]: array([ True, False, False], dtype=bool)

pandas還處理相同長度的不一樣數組對象之間的元素比較

In [66]: pd.Series(['foo', 'bar', 'baz']) == pd.Index(['foo', 'bar', 'qux']) Out[66]: 0 True 1 True 2 False dtype: bool In [67]: pd.Series(['foo', 'bar', 'baz']) == np.array(['foo', 'bar', 'qux']) Out[67]: 0 True 1 True 2 False dtype: bool

嘗試比較Index或Series不一樣長度的對象將引起ValueError

注意:這個和NumPy的廣播不同

組合重疊數據集

兩個類似數據集的組合,其中一個比較好。咱們但願組合兩個DataFrame對象,其中一個DataFrame中的缺失值有條件地填充來自其餘DataFrame的相似標記的值。實現操做的函數是combine_first(),如同位置兩邊都存在則使用第一個。

In [70]: df1 = pd.DataFrame({'A' : [1., np.nan, 3., 5., np.nan], ....: 'B' : [np.nan, 2., 3., np.nan, 6.]}) ....: In [71]: df2 = pd.DataFrame({'A' : [5., 2., 4., np.nan, 3., 7.], ....: 'B' : [np.nan, np.nan, 3., 4., 6., 8.]}) ....: In [72]: df1 Out[72]: A B 0  1.0 NaN 1  NaN  2.0
2  3.0  3.0
3  5.0 NaN 4  NaN  6.0 In [73]: df2 Out[73]: A B 0  5.0 NaN 1  2.0 NaN 2  4.0  3.0
3  NaN  4.0
4  3.0  6.0
5  7.0  8.0 In [74]: df1.combine_first(df2) Out[74]: A B 0  1.0 NaN 1  2.0  2.0
2  3.0  3.0
3  5.0  4.0
4  3.0  6.0
5  7.0  8.0

通用DataFrame組合

另外一個DataFrame和組合器函數,對齊輸入DataFrame,而後傳遞Series的組合器函數對(名稱相同的列)

In [75]: combiner = lambda x, y: np.where(pd.isna(x), y, x) In [76]: df1.combine(df2, combiner)

描述性統計

 

 

 

 

 

 

 

 

 

 

 

 

 

http://pandas.pydata.org/pandas-docs/stable/basics.html

相關文章
相關標籤/搜索