Series: pandas的長槍(數據表中的一列或一行,觀測向量,一維數組...)javascript
Series1 = pd.Series(np.random.randn(4)) print Series1,type(Series1) print Series1.index print Series1.values
輸出結果:html
0 -0.676256 1 0.533014 2 -0.935212 3 -0.940822 dtype: float64 <class 'pandas.core.series.Series'> Int64Index([0, 1, 2, 3], dtype='int64') [-0.67625578 0.53301431 -0.93521212 -0.94082195]
print Series1>0 print Series1[Series1>0]
輸出結果以下:java
0 0.030480 1 0.072746 2 -0.186607 3 -1.412244 dtype: float64 <class 'pandas.core.series.Series'> Int64Index([0, 1, 2, 3], dtype='int64') [ 0.03048042 0.07274621 -0.18660749 -1.41224432]
我發現,邏輯表達式,得到的值就是True或者False。要先取得值,仍是要X[y]的形式。python
什麼是broadcasting
,暫時我也不太清楚,看個栗子:數據庫
print Series1*2 print Series1+5
輸出結果以下:json
0 0.06096 1 1 0.145492 2 -0.373215 3 -2.824489 dtype: float64 0 5.030480 1 5.072746 2 4.813393 3 3.587756 dtype: float64
numpy.frompyfunc(out,nin,nout) 返回的是一個函數,nin是輸入的參數個數,nout是函數返回的對象的個數函數說明api
這句話的意思,個人理解是序列儘可能是一列,不用去建立2列,這樣子,使用index就能指定數據了數組
Series2 = pd.Series(Series1.values,index=['norm_'+unicode(i) for i in xrange(4)]) print Series2,type(Series2) print Series2.index print type(Series2.index) print Series2.values
輸出結果以下,能夠看到,它是經過修改了index
值的樣式,並無建立2列。安全
norm_0 -0.676256 norm_1 0.533014 norm_2 -0.935212 norm_3 -0.940822 dtype: float64 <class 'pandas.core.series.Series'> Index([u'norm_0', u'norm_1', u'norm_2', u'norm_3'], dtype='object') <class 'pandas.core.index.Index'> [-0.67625578 0.53301431 -0.93521212 -0.94082195]
雖然行是有順序的,可是仍然可以經過行級的index來訪問到數據:網絡
(固然也不盡然像Ordered Dict,由於⾏索引甚⾄能夠重複,不推薦重複的行索引不表明不能用)
print Series2[['norm_0','norm_3']]
能夠看到,讀取數據時,確實要採用X[y]的格式。這裏X[[y]]是由於,它要讀取兩個數據,指定的是這兩個數據的index
值,將index
值存放進list
中,而後讀取。輸出結果以下:
norm_0 -0.676256 norm_3 -0.940822 dtype: float64
再好比:
print 'norm_0' in Series2 print 'norm_6' in Series2
輸出結果:
True False
邏輯表達式的輸出結果,布爾型值。
Series3_Dict = {"Japan":"Tokyo","S.Korea":"Seoul","China":"Beijing"} Series3_pdSeries = pd.Series(Series3_Dict) print Series3_pdSeries print Series3_pdSeries.values print Series3_pdSeries.index
輸出結果:
China Beijing Japan Tokyo S.Korea Seoul dtype: object ['Beijing' 'Tokyo' 'Seoul'] Index([u'China', u'Japan', u'S.Korea'], dtype='object')
經過上面的輸出結果就知道了,輸出結果是無序的,和輸入順序無關。
想讓序列按你的排序⽅式保存?就算有缺失值都毫無問題
Series4_IndexList = ["Japan","China","Singapore","S.Korea"] Series4_pdSeries = pd.Series( Series3_Dict ,index = Series4_IndexList) print Series4_pdSeries print Series4_pdSeries.values print Series4_pdSeries.index print Series4_pdSeries.isnull() print Series4_pdSeries.notnull()
上面這樣的輸出就會按照list
中定義的順序輸出結果。
整個序列級別的元數據信息:name
當數據序列以及index自己有了名字,就能夠更方便的進行後續的數據關聯啦!
這裏我感受就是列名的做用。下面舉例:
print Series4_pdSeries.name print Series4_pdSeries.index.name
很顯然,輸出的結果都是None
,由於咱們還沒指定name
嘛!
Series4_pdSeries.name = "Capital Series" Series4_pdSeries.index.name = "Nation" print Series4_pdSeries
輸出結果:
Nation Japan Tokyo China Beijing Singapore NaN S.Korea Seoul Name: Capital Series, dtype: object
"字典"?不是的,⾏index能夠重複,儘管不推薦。
Series5_IndexList = ['A','B','B','C'] Series5 = pd.Series(Series1.values,index = Series5_IndexList) print Series5 print Series5[['B','A']]
輸出結果:
A 0.030480 B 0.072746 B -0.186607 C -1.412244 dtype: float64 B 0.072746 B -0.186607 A 0.030480 dtype: float64
咱們能夠看出,Series['B']輸出了兩個值,因此index值儘可能不要重複呀!
DataFrame:pandas的戰錘(數據表,⼆維數組)
Series的有序集合,就像R的DataFrame同樣方便。
仔細想一想,絕大部分的數據形式均可以表現爲DataFrame。
dataNumPy = np.asarray([('Japan','Tokyo',4000),('S.Korea','Seoul',1300),('China','Beijing',9100)]) DF1 = pd.DataFrame(dataNumPy,columns=['nation','capital','GDP']) DF1
這裏DataFrame中的columns
應該就是列名的意思。如今看print
的結果,是否是很舒服啊!Excel的樣式嘛
dataDict = {'nation':['Japan','S.Korea','China'],'capital':['Tokyo','Seoul','Beijing'],'GDP':[4900,1300,9100]} DF2 = pd.DataFrame(dataDict) DF2
輸出結果能夠發現,無序的!
GDP capital nation 0 4900 Tokyo Japan 1 1300 Seoul S.Korea 2 9100 Beijing China
PS:因爲懶得截圖放過來,這裏沒有了邊框線。
DF21 = pd.DataFrame(DF2,columns=['nation','capital','GDP']) DF21
很明顯,這裏是利用DF2
定義DF21,還經過指定cloumns
改變了列名的順序。
DF22 = pd.DataFrame(DF2,columns=['nation','capital','GDP'],index = [2,0,1]) DF22
很明顯,這裏定義了columns
的順序,還定義了index
的順序。
nation capital GDP 2 China Beijing 9100 0 Japan Tokyo 4900 1 S.Korea Seoul 1300
OMG,囧,我居然都快忘了js語法了,如今想起了,可是對象的屬性既能夠obj.x
也能夠obj[x]
。
'.'的寫法容易與其餘預留關鍵字產生衝突
'[ ]'的寫法最安全。
print DF22[0:1] #給出的實際是DataFrame print DF22.ix[0] #經過對應Index給出⾏,**ix**好爽。
輸出結果:
nation capital GDP 2 China Beijing 9100 nation Japan capital Tokyo GDP 4900 Name: 0, dtype: object
print DF22.iloc[0,:] #第一個參數是第幾行,第二個參數是列。這裏呢,就是第0行,所有列 print DF22.iloc[:,0] #根據上面的描述,這裏是所有行,第0列
輸出結果,驗證一下:
nation China capital Beijing GDP 9100 Name: 2, dtype: object 2 China 0 Japan 1 S.Korea Name: nation, dtype: object
舉個栗子說明一下就明白了:
DF22['population'] = [1600,130,55] DF22
輸出結果:
nation capital GDP population 2 China Beijing 9100 1600 0 Japan Tokyo 4900 130 1 S.Korea Seoul 1300 55
Index:pandas進⾏數據操縱的鬼牌(行級索引)
⾏級索引是:
元數據
可能由真實數據產生,所以能夠視做數據
能夠由多重索引也就是多個列組合而成
能夠和列名進行交換,也能夠進行堆疊和展開,達到Excel透視表效果
Index有四種...哦不,不少種寫法,⼀些重要的索引類型包括:
pd.Index(普通)
Int64Index(數值型索引)
MultiIndex(多重索引,在數據操縱中更詳細描述)
DatetimeIndex(以時間格式做爲索引)
PeriodIndex (含週期的時間格式做爲索引)
index_names = ['a','b','c'] Series_for_Index = pd.Series(index_names) print pd.Index(index_names) print pd.Index(Series_for_Index)
輸出結果:
Index([u'a', u'b', u'c'], dtype='object') Index([u'a', u'b', u'c'], dtype='object')
惋惜Immutable,牢記! 不可變!舉例以下:此處挖坑啊。不明白……
index_names = ['a','b','c'] index0 = pd.Index(index_names) print index0.get_values() index0[2] = 'd'
輸出結果以下:
['a' 'b' 'c'] --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-36-f34da0a8623c> in <module>() 2 index0 = pd.Index(index_names) 3 print index0.get_values() ----> 4 index0[2] = 'd' C:\Anaconda\lib\site-packages\pandas\core\index.pyc in __setitem__(self, key, value) 1055 1056 def __setitem__(self, key, value): -> 1057 raise TypeError("Indexes does not support mutable operations") 1058 1059 def __getitem__(self, key): TypeError: Indexes does not support mutable operations
惋惜,若是這個List Comprehension改爲小括號,就不對了。
multi1 = pd.Index([('Row_'+str(x+1),'Col_'+str(y+1)) for x in xrange(4) for y in xrange(4)]) multi1.name = ['index1','index2'] print multi1
輸出結果:
MultiIndex(levels=[[u'Row_1', u'Row_2', u'Row_3', u'Row_4'], [u'Col_1', u'Col_2', u'Col_3', u'Col_4']], labels=[[0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3], [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]])
下列代碼說明:
二重MultiIndex的Series能夠unstack()成DataFrame
DataFrame能夠stack成擁有⼆重MultiIndex的Series
data_for_multi1 = pd.Series(xrange(0,16),index=multi1) data_for_multi1
輸出結果:
Row_1 Col_1 0 Col_2 1 Col_3 2 Col_4 3 Row_2 Col_1 4 Col_2 5 Col_3 6 Col_4 7 Row_3 Col_1 8 Col_2 9 Col_3 10 Col_4 11 Row_4 Col_1 12 Col_2 13 Col_3 14 Col_4 15 dtype: int32
看到輸出結果,好像明白了點,有點相似Excel彙總同樣。不過,往後還得查點資料
data_for_multi1.unstack()
data_for_multi1.unstack().stack()
輸出結果:
Row_1 Col_1 0 Col_2 1 Col_3 2 Col_4 3 Row_2 Col_1 4 Col_2 5 Col_3 6 Col_4 7 Row_3 Col_1 8 Col_2 9 Col_3 10 Col_4 11 Row_4 Col_1 12 Col_2 13 Col_3 14 Col_4 15 dtype: int32
multi2 = pd.Index([('Row_'+str(x+1),'Col_'+str(y+1)) for x in xrange(5) for y in xrange(x)]) multi2
輸出結果:
MultiIndex(levels=[[u'Row_2', u'Row_3', u'Row_4', u'Row_5'], [u'Col_1', u'Col_2', u'Col_3', u'Col_4']], labels=[[0, 1, 1, 2, 2, 2, 3, 3, 3, 3], [0, 0, 1, 0, 1, 2, 0, 1, 2, 3]])
data_for_multi2 = pd.Series(np.arange(10),index = multi2) data_for_multi2
輸出結果:
Row_2 Col_1 0 Row_3 Col_1 1 Col_2 2 Row_4 Col_1 3 Col_2 4 Col_3 5 Row_5 Col_1 6 Col_2 7 Col_3 8 Col_4 9 dtype: int32
import datetime dates = [datetime.datetime(2015,1,1),datetime.datetime(2015,1,8),datetime.datetime(2015,1,30)] pd.DatetimeIndex(dates)
輸出結果:
DatetimeIndex(['2015-01-01', '2015-01-08', '2015-01-30'], dtype='datetime64[ns]', freq=None, tz=None)
periodindex1 = pd.period_range('2015-01','2015-04',freq='M') print periodindex1
輸出結果:
PeriodIndex(['2015-01', '2015-02', '2015-03', '2015-04'], dtype='int64', freq='M')
有的公司統⼀以1號表明當月,有的公司統一以最後1天表明當⽉,轉化起來很麻煩,能夠asfreq
print periodindex1.asfreq('D',how='start') print periodindex1.asfreq('D',how='end')
輸出結果:
PeriodIndex(['2015-01-01', '2015-02-01', '2015-03-01', '2015-04-01'], dtype='int64', freq='D') PeriodIndex(['2015-01-31', '2015-02-28', '2015-03-31', '2015-04-30'], dtype='int64', freq='D')
periodindex_mon = pd.period_range('2015-01','2015-03',freq='M').asfreq('D',how='start') periodindex_day = pd.period_range('2015-01-01','2015-03-31',freq='D') print periodindex_mon print periodindex_day
輸出結果:
PeriodIndex(['2015-01-01', '2015-02-01', '2015-03-01'], dtype='int64', freq='D') PeriodIndex(['2015-01-01', '2015-01-02', '2015-01-03', '2015-01-04', '2015-01-05', '2015-01-06', '2015-01-07', '2015-01-08', '2015-01-09', '2015-01-10', '2015-01-11', '2015-01-12', '2015-01-13', '2015-01-14', '2015-01-15', '2015-01-16', '2015-01-17', '2015-01-18', '2015-01-19', '2015-01-20', '2015-01-21', '2015-01-22', '2015-01-23', '2015-01-24', '2015-01-25', '2015-01-26', '2015-01-27', '2015-01-28', '2015-01-29', '2015-01-30', '2015-01-31', '2015-02-01', '2015-02-02', '2015-02-03', '2015-02-04', '2015-02-05', '2015-02-06', '2015-02-07', '2015-02-08', '2015-02-09', '2015-02-10', '2015-02-11', '2015-02-12', '2015-02-13', '2015-02-14', '2015-02-15', '2015-02-16', '2015-02-17', '2015-02-18', '2015-02-19', '2015-02-20', '2015-02-21', '2015-02-22', '2015-02-23', '2015-02-24', '2015-02-25', '2015-02-26', '2015-02-27', '2015-02-28', '2015-03-01', '2015-03-02', '2015-03-03', '2015-03-04', '2015-03-05', '2015-03-06', '2015-03-07', '2015-03-08', '2015-03-09', '2015-03-10', '2015-03-11', '2015-03-12', '2015-03-13', '2015-03-14', '2015-03-15', '2015-03-16', '2015-03-17', '2015-03-18', '2015-03-19', '2015-03-20', '2015-03-21', '2015-03-22', '2015-03-23', '2015-03-24', '2015-03-25', '2015-03-26', '2015-03-27', '2015-03-28', '2015-03-29', '2015-03-30', '2015-03-31'], dtype='int64', freq='D')
reindex
+ffill/bfill
full_ts = pd.Series(periodindex_mon,index=periodindex_mon).reindex(periodindex_day,method='ffill') full_ts
前⾯描述過了,索引有序,重複,但⼀定程度上⼜能經過key來訪問,也就是說,某些集合操做都是能夠⽀持的。
index1 = pd.Index(['A','B','B','C','C']) index2 = pd.Index(['C','D','E','E','F']) index3 = pd.Index(['B','C','A']) print index1.append(index2) print index1.difference(index2) print index1.intersection(index2) print index1.union(index2) # Support unique-value Index well print index1.isin(index2) print index1.delete(2) print index1.insert(0,'K') # Not suggested print index3.drop('A') # Support unique-value Index well print index1.is_monotonic,index2.is_monotonic,index3.is_monotonic print index1.is_unique,index2.is_unique,index3.is_unique
輸出結果:
Index([u'A', u'B', u'B', u'C', u'C', u'C', u'D', u'E', u'E', u'F'], dtype='object') Index([u'A', u'B'], dtype='object') Index([u'C', u'C'], dtype='object') Index([u'A', u'B', u'B', u'C', u'C', u'D', u'E', u'E', u'F'], dtype='object') [False False False True True] Index([u'A', u'B', u'C', u'C'], dtype='object') Index([u'K', u'A', u'B', u'B', u'C', u'C'], dtype='object') Index([u'B', u'C'], dtype='object') True True False False False True
老生常談,從基礎來看,咱們仍然關心pandas對於與外部數據是如何交互的。
read_csv與to_csv 是⼀對輸⼊輸出的⼯具,read_csv直接返回pandas.DataFrame,⽽to_csv只要執行命令便可寫文件
read_table:功能相似
read_fwf:操做fixed width file
read_excel與to_excel方便的與excel交互
header 表⽰數據中是否存在列名,若是在第0行就寫就寫0,而且開始讀數據時跳過相應的行數,不存在能夠寫none
names 表示要用給定的列名來做爲最終的列名
encoding 表⽰數據集的字符編碼,一般而言一份數據爲了⽅便的進⾏⽂件傳輸都以utf-8做爲標準
這裏用的是本身的一個csv
數據,由於找不到參考的這個pdf中的數據。
cnames=['經度','緯度'] taxidata2 = pd.read_csv('20140401.csv',header = 4,names=cnames,encoding='utf-8') taxidata2
所有參數的請移步API:
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html#pandas.read_csv
這裏介紹一些經常使用的參數:
讀取處理:
skiprows:跳過⼀定的⾏數
nrows:僅讀取⼀定的⾏數
skipfooter:尾部有固定的⾏數永不讀取
skip_blank_lines:空⾏跳過
內容處理:
sep/delimiter:分隔符很重要,常⻅的有逗號,空格和Tab('\t')
na_values:指定應該被看成na_values的數值
thousands:處理數值類型時,每千位分隔符並不統⼀ (1.234.567,89或者1,234,567.89均可能),此時要把字符串轉化爲
數字須要指明千位分隔符
收尾處理:
index_col:將真實的某列(列的數⺫,甚⾄列名)看成index
squeeze:僅讀到⼀列時,再也不保存爲pandas.DataFrame⽽是pandas.Series
對於存儲着極爲規整數據的Excel而言,實際上是不必必定用Excel來存,儘管Pandas也十分友好的提供了I/O接口。
taxidata.to_excel('t0401.xlsx',encoding='utf-8') taxidata_from_excel = pd.read_excel('t0401.xlsx',header=0, encoding='utf-8') taxidata_from_excel
注意:當你的xls文件行數不少超過65536時,就會遇到錯誤,解決辦法是將寫入的格式變爲xlsx
。excel函數受限制問題
惟一重要的參數:sheetname=k,標誌着一個excel的第k個sheet頁將會被取出。(從0開始)
JSON:網絡傳輸中常⽤的⼀種數據格式。
仔細看一下,實際上這就是咱們平時收集到異源數據的風格是一致的:
列名不能徹底匹配
key可能並不惟一
元數據被保存在數據裏
import json json_data = [{'name':'Wang','sal':50000,'job':'VP'},\ {'name':'Zhang','job':'Manager','report':'VP'},\ {'name':'Li','sal':5000,'report':'IT'}] data_employee = pd.read_json(json.dumps(json_data)) data_employee_ri = data_employee.reindex(columns=['name','job','sal','report']) data_employee_ri
輸出結果:
在前面部分的基礎上,數據會有更多種操縱方式:
經過列名、行index來取數據,結合ix、iloc靈活的獲取數據的一個子集(第一部分已經介紹)
按記錄拼接(就像Union All)或者關聯(join)
方便的統計函數與⾃定義函數映射
排序
缺失值處理
與Excel同樣靈活的數據透視表(在第四部分更詳細介紹)
pd.DataFrame([np.random.rand(2),np.random.rand(2),np.random.rand(2)],columns=['C1','C2'])
pd.concat([data_employee_ri,data_employee_ri,data_employee_ri])
輸出結果
### 縱向拼接:Merge
根據數據列關聯,使用on關鍵字
能夠指定一列或多列
可使⽤left_on和right_on
pd.merge(data_employee_ri,data_employee_ri,on='name')
根據index關聯,能夠直接使用left_index和right_index
TIPS: 增長how關鍵字,並指定
how = 'inner'
how = 'left'
how = 'right'
how = 'outer'
結合how,能夠看到merge基本再現了SQL應有的功能,並保持代碼整潔
dataNumPy32 = np.asarray([('Japan','Tokyo',4000),('S.Korea','Seoul',1300),('China','Beijing',9100)]) DF32 = pd.DataFrame(dataNumPy32,columns=['nation','capital','GDP']) DF32
def GDP_Factorize(v): fv = np.float64(v) if fv > 6000.0: return 'High' elif fv < 2000.0: return 'Low' else: return 'Medium' DF32['GDP_Level'] = DF32['GDP'].map(GDP_Factorize) DF32['NATION'] = DF32.nation.map(str.upper) DF32
sort: 按⼀列或者多列的值進行行級排序
sort_index: 根據index⾥的取值進行排序,並且能夠根據axis決定是重排行仍是列
dataNumPy33 = np.asarray([('Japan','Tokyo',4000),('S.Korea','Seoul',1300),('China','Beijing',9100)]) DF33 = pd.DataFrame(dataNumPy33,columns=['nation','capital','GDP']) DF33
DF33.sort(['capital','nation'],ascending=False)
ascending
是降序的意思。
DF33.sort_index(axis=1,ascending=True)
DF33.rank()
DF34.mean(skipna=True)
不忽略缺失值的話,估計就不能計算均值了吧。
若是不想忽略缺失值的話,就須要祭出fillna了:
注:這裏我在猜測,axis=1
是否是就表明從行
的角度呢?仍是得多讀書查資料呀。
groupby的功能相似SQL的group by關鍵字:
Split-Apply-Combine
Split,就是按照規則分組
Apply,經過⼀定的agg函數來得到輸⼊pd.Series返回⼀個值的效果
Combine,把結果收集起來
Pandas的groupby的靈活性:
分組的關鍵字能夠來⾃於index,也能夠來⾃於真實的列數據
分組規則能夠經過⼀列或者多列
沒有具體數據,截圖看一下吧,方便往後回憶。
分組能夠快速實現MapReduce
的邏輯
Map: 指定分組的列標籤,不一樣的值就會被扔到不一樣的分組處理
Reduce: 輸入多個值,返回1個值,通常能夠經過agg實現,agg能接受1個函數
本文博客地址Python數據分析入門之pandas總結基礎
本文由 Michael翔 創做,採用 知識共享署名 3.0 中國大陸許可協議 進行許可。 可自由轉載、引用,但需署名做者且註明文章出處。