《利用pyhton進行資料分析》筆記-Pandas(二)
Pandas筆記第二章:
接上一章, 本章主是Pandas資料的增刪改查,以及算術運算和函式的應用以及對映。
1.索引、選取和過濾
# Series obj = Series(np.arange(4), index=['a', 'b', 'c', 'd']) obj['b']# 選取 索引b 值, 返回值為 1 obj[1] # 根據下標獲取值 obj[:2] # 下標切片索引 # 返回值: # a0 # b1 # dtype: int64 obj['a':'c'] # 標籤切片 # 返回值 # a0 # b1 # c2 # dtype: int64 obj[obj>1] # 跟據元素的值過濾 # 返回值 # c2 # d3 # dtype: int64 obj[['a','b','c']] # 根據標籤索引多個 # 返回值 # a0 # b1 # c2 # dtype: int64 obj<3 # 每個元素的比較 # 返回bool值: # aTrue # bTrue # cTrue # dFalse # dtype: bool # DataFrame data = DataFrame(np.arange(16).reshape((4,4)), index=['a', 'b', 'c', 'd'], columns=['one', 'two', 'three', 'four']) data['one'] # 返回值 # a0 # b4 # c8 # d12 # Name: one, dtype: int64 data[['one','two']] # 返回值 #one two #a01 #b45 #c89 #d1213 data[1:2] # 開區間,右邊的數不包含 # 返回值 #onetwo threefour #b4567 data['one':'two']# 注意, 這種方法根本不可用 # 返回值 #one two threefour data[data['one']>4] # 返回值 #one two threefour #c891011 #d12131415 data<8 # 返回值: #one two threefour # a TrueTrueTrueTrue # b TrueTrueTrueTrue # c FalseFalseFalseFalse # d FalseFalseFalseFalse data.iloc[1:4] # 返回值 #one two threefour # b 4567 # c 891011 # d 12131415 data.loc['a':'c'] # 返回值 #one two threefour # a 0123 # b 4567 # c 89101 data.loc ['a',['one', 'three' ]] # # 返回值: # one0 # three2 # Name: a, dtype: int32 data.loc['a'].iloc[[2,3]] # 返回值 # three2 # four3 # Name: a, dtype: int32 data.ix[data.one > 3,:3] # 返回值 #one two three # b 456 # c 8910 # d 121314 data.loc[data.one > 3].iloc[:,:3] # 與上邊等價 # 返回值 #one two three # b 456 # c 8910 # d 121314
需要注意的有兩點:
- 利用下標索引與利用標籤索引的區別:下標索引為開區間, 標籤索引為閉區間。
-
ix方法已經不推薦始用,改用loc以及iloc。
loc是根據定義的index標籤索引。 iloc根據行號(下標)索引。需要注意的是, 這兩種方法都是用來對行進行操作。
2. 算術運算和資料對齊
pandas可以對不同索引的物件進行算術運算,如果存在不同的索引對,結果的索引就是該索引對的並集。
2.1 Series
s1 = Series([1,2,3,4,5], index=['a','b','c','d','e']) s2 = Series([6,5,4,3,2,1,],index=['a','d', 'e','g', 'n','m']) s1+s2 # 返回值: a7.0 bNaN cNaN d9.0 e9.0 gNaN mNaN nNaN dtype: float64
自動的資料對齊操作在不重疊的索引處引入NaN。缺失值會在算術運算過程中傳播。簡單的講就是:兩個物件相同的索引進行運算, 不同的索引置NAN,並取並集。
2.2 DataFrame
DataFrame 資料對齊的操作, 會同時發生在行和列上, 即:行索引和列索引都行同時才進行運算,不同的置NAN,然後取並集。
df1 = DataFrame(np.arange(9).reshape((3,3)),index=['a','b','c'], columns=['A','B','C']) df2 = DataFrame(np.arange(16).reshape((4,4)),index=['a','e','c','m'], columns=['A','E','C','M']) df1+df2# 兩值想乘同樣如此 # 返回值: ABCEM a0.0 NaN 4.0 NaN NaN bNaN NaN NaN NaN NaN c14.0NaN 18. NaN NaN eNaN NaN NaN NaN NaN mNaN NaN NaN NaN NaN
2.3 在算術方法中進行填充
df1.add(df2,fill_value=0)# 其他的運算方法: sub(-)div(/)mul(*) # 返回值: #ABCEM # a 0.01.04.01.03.0 # b 3.04.05.0NaNNaN # c 14.07.018.09.011.0 # e 4.0NaN6.05.07.0 # m 12.0NaN14.013.015.0
通過這個例子可以看出:
1.將兩個物件取並集, 行、列索引相同時,進行相應的運算;
2.其中的一個物件裡邊沒有值時,以fill_value的值進行填充, 然後進行運算;
3.當兩個物件中都沒有值時,則置NAN;
2.4 DataFrame 和 Series中之間的運算(要區別於矩陣運算)
df3 =DataFrame(np.arange(16).reshape((4,4)),index=['a','e','c','m'], columns=['A','E','C','M']) # 值: #AECM # a0123 # e4567 # c891011 # m12131415 ser = df3.iloc[0] # 值 # A0 # E1 # C2 # M3 df3 - ser #返回值 #AECM # a 0000 # e 4444 # c 8888 # m 12121212 ser2 = Series(range(3),index=['E','M','F']) print (ser2) # 返回值 # E0 # M1 # F2 df3-ser2 # 返回值 #ACEFM # a NaN NaN1.0 NaN2.0 # e NaN NaN5.0 NaN6.0 # c NaN NaN9.0 NaN10.0 # m NaN NaN13.0 NaN14.0 df3.sub(ser2, axis=0) # 返回值 # A ECM # E NaN NaN NaN NaN # F NaN NaN NaN NaN # M NaN NaN NaN NaN # a NaN NaN NaN NaN # c NaN NaN NaN NaN # e NaN NaN NaN NaN # m NaN NaN NaN NaN
通過以上的例子可以看出:
1.DataFrame和Series之間的算術運算,會將Series的索引匹配到DataFrame的列(Series本身就是一維資料), 然後對DataFrame的每行資料進行運算。
- 當其中一個物件的索引不存在時時,則置NAN。
- 可以通過算術方法改變廣播的軸。
值得注意的是:
- 書中的例子 ix方法已經不推薦使用,需要用iloc 或者loc進行替代。
- 算術方法中fill_value會報錯。
3.函式的應用和對映
df3 # 返回值 #AECM # a 0123 # e 4567 # c 891011 # m 12131415 df3.apply(lambda x:x.max()-x.min()) # 對於軸級別, 預設為0軸 # 返回值 # A12 # E12 # C12 # M12 # dtype: int64 df3.apply(lambda x:x.max()-x.min(), axis=1)# 對於軸級別,指定為1軸 # 返回值 # a3 # e3 # c3 # m3 # dtype: int64 df3.applymap(lambda x:x+1) # 元素級 # 返回值 #AECM # a 1234 # e 5678 # c 9101112 # m 13141516
注意區別python中的map, Series中的map。
總注:本章的筆記比較零碎。要對比於pyhton中的list,numpy中array進行學習效果更佳。再強調一點:pandas中, 已經不建議始用ix, 建議改成iloc以及loc的始用。
本人水平有限, 如有錯誤歡迎提出指正!如有參考, 請註明出處!!禁止抄襲!