摘要:整個序列級別的元數據信息當數據序列以及本身有了名字,就可以更方便的進行后續的數據關聯啦這里我感覺就是列名的作用。數據分析入門之總結基礎二歡迎來翔的博客查看完成版。
一. Series
Series: pandas的長槍(數據表中的一列或一行,觀測向量,一維數組...)
Series1 = pd.Series(np.random.randn(4)) print Series1,type(Series1) print Series1.index print Series1.values
輸出結果:
0 -0.676256 1 0.533014 2 -0.935212 3 -0.940822 dtype: float64Int64Index([0, 1, 2, 3], dtype="int64") [-0.67625578 0.53301431 -0.93521212 -0.94082195]
np.random.randn() 正態分布相關。函數說明
Series?持過濾的原理就如同NumPyprint Series1>0 print Series1[Series1>0]
輸出結果如下:
0 0.030480 1 0.072746 2 -0.186607 3 -1.412244 dtype: float64Int64Index([0, 1, 2, 3], dtype="int64") [ 0.03048042 0.07274621 -0.18660749 -1.41224432]
我發現,邏輯表達式,獲得的值就是True或者False。要先取得值,還是要X[y]的形式。
當然也支持廣播Broadcasting什么是broadcasting,暫時我也不太清楚,看個栗子:
print Series1*2 print Series1+5
輸出結果如下:
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以及Universal Function
numpy.frompyfunc(out,nin,nout) 返回的是一個函數,nin是輸入的參數個數,nout是函數返回的對象的個數函數說明
在序列上就使用行標,而不是創建1個2列的數據表,能夠輕松辨別哪是數據,哪是元數據這句話的意思,我的理解是序列盡量是一列,不用去創建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: float64Index([u"norm_0", u"norm_1", u"norm_2", u"norm_3"], dtype="object") [-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
邏輯表達式的輸出結果,布爾型值。
從Key不重復的Ordered Dict或者從Dict來定義Series就不需要擔心行索引重復: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值盡量不要重復呀!
二. DataFrameDataFrame:pandas的戰錘(數據表,?維數組)
Series的有序集合,就像R的DataFrame一樣方便。
仔細想想,絕大部分的數據形式都可以表現為DataFrame。
從NumPy二維數組、從文件或者從數據庫定義:數據雖好,勿忘列名dataNumPy = np.asarray([("Japan","Tokyo",4000),("S.Korea","Seoul",1300),("China","Beijing",9100)]) DF1 = pd.DataFrame(dataNumPy,columns=["nation","capital","GDP"]) DF1
這里DataFrame中的columns應該就是列名的意思?,F在看print的結果,是不是很舒服??!Excel的樣式嘛
等長的列數據保存在一個字典里(JSON):很不幸,字典key是無序的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:由于懶得截圖放過來,這里沒有了邊框線。
從另一個DataFrame定義DataFrame:啊,強迫癥犯了!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從DataFrame中取出列?兩種方法(與JavaScript完全一致?。?/b>
OMG,囧,我竟然都快忘了js語法了,現在想起了,但是對象的屬性既可以obj.x也可以obj[x]。
"."的寫法容易與其他預留關鍵字產生沖突
"[ ]"的寫法最安全。
從DataFrame中取出行?(至少)兩種?法:方法1和方法2:
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
方法3 像NumPy切片一樣的終極招式:iloc :
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:行級索引
Index:pandas進?數據操縱的鬼牌(行級索引)
?級索引是:
元數據
可能由真實數據產生,因此可以視作數據
可以由多重索引也就是多個列組合而成
可以和列名進行交換,也可以進行堆疊和展開,達到Excel透視表效果
Index有四種...哦不,很多種寫法,?些重要的索引類型包括:
pd.Index(普通)
Int64Index(數值型索引)
MultiIndex(多重索引,在數據操縱中更詳細描述)
DatetimeIndex(以時間格式作為索引)
PeriodIndex (含周期的時間格式作為索引)
直接定義普通索引,長得就和普通的Series?樣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)扔進去一個含有多元組的List,就有了MultiIndexin () 2 index0 = pd.Index(index_names) 3 print index0.get_values() ----> 4 index0[2] = "d" C:Anacondalibsite-packagespandascoreindex.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]])對于Series來說,如果擁有了多重Index,數據,變形!
下列代碼說明:
二重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匯總一樣。不過,日后還得查點資料
二重MultiIndex的Series可以unstack()成DataFramedata_for_multi1.unstack()DataFrame可以stack成擁有?重MultiIndex的Series
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: int32DateTime標準庫如此好?,你值得擁有
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參考:
S1EP3_Pandas.pdf 不知道什么時候存到電腦里的資料,今天發現了它。感謝作者的資料。
Python數據分析入門之pandas總結基礎(二)
歡迎來Michael翔的博客查看完成版。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37702.html
摘要:一大熊貓世界來去自如的老生常談,從基礎來看,我們仍然關心對于與外部數據是如何交互的。函數受限制問題唯一重要的參數,標志著一個的第個頁將會被取出。數據分析入門之總結基礎一歡迎來翔的博客查看完成版。 一.大熊貓世界來去自如:Pandas的I/O 老生常談,從基礎來看,我們仍然關心pandas對于與外部數據是如何交互的。 1.1 結構化數據輸入輸出 read_csv與to_csv 是?對...
摘要:時間永遠都過得那么快,一晃從年注冊,到現在已經過去了年那些被我藏在收藏夾吃灰的文章,已經太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...
摘要:在這里我分享下我個人入門機器學習的經歷,希望能對大家能有所幫助。相關學習鏈接,,入門后的體驗在入門了機器學習之后,在實際工作中,絕大多數的情況下你并不需要去創造一個新的算法。 機器學習在很多眼里就是香餑餑,因為機器學習相關的崗位在當前市場待遇不錯,但同時機器學習在很多人面前又是一座大山,因為發現它太難學了。在這里我分享下我個人入門機器學習的經歷,希望能對大家能有所幫助。 PS:這篇文章...
閱讀 1764·2021-10-11 10:59
閱讀 2402·2021-09-30 09:53
閱讀 1765·2021-09-22 15:28
閱讀 2795·2019-08-29 15:29
閱讀 1558·2019-08-29 13:53
閱讀 3207·2019-08-29 12:34
閱讀 2849·2019-08-26 10:16
閱讀 2661·2019-08-23 15:16