python Pandas庫的學習
2021/12/9 14:46:49
本文主要是介绍python Pandas庫的學習,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Pandas
Series對象
Series 對象用於表示一維的數據結構,其主數組的每個元素都會有一個與之相關聯的標簽。(大致如下圖所示)
對象的聲明
通過 pd.Series() 進行聲明,在未指定標簽的情況下,默認使用從0開始一次遞增的數值作爲標簽。
s = pd.Series([12, -4, 7, 9]) print(s) ------------------------------------ 0 12 1 -4 2 7 3 9 dtype: int64
s = pd.Series([12, -4, 7, 9], index=["A", "B", "C", "D"]) print(s) ------------------------------- A 12 B -4 C 7 D 9 dtype: int64
當然,也可以通過其他的形式來聲明對象(操作如下:
注意,在這種情況下,如果原有對象的值改變,則 Series 對象中的元素也會發生改變。
arr = np.array([1, 2, 3, 4]) s = pd.Series(arr) print(s) -------------------------------- 0 1 1 2 2 3 3 4 dtype: int32
Series 亦可使用字典來進行初始化(其格式其實與字典相差無几)。
my_dict = {"red":100, "blue":200,"green":300} s = pd.Series(my_dict) print(s) ----------------------------------- red 100 blue 200 green 300 dtype: int64
屬性的獲取
毫無疑問,可以獲取 Seris 的兩個屬性,Index 和 Values。
s = pd.Series([12, -4, 7, 9], index = ["A", "B", "C", "D"]) print(s) print("values:",s.values) print("index:",s.index) ---------------------------------- A 12 B -4 C 7 D 9 dtype: int64 values: [12 -4 7 9] index: Index(['A', 'B', 'C', 'D'], dtype='object')
對象操作
元素賦值
通過下標或索引對元素進行賦值。
s = pd.Series([12, -4, 7, 9], index=["A", "B", "C", "D"]) print(s) s[0] = 0 print("0:",s[0]) s["B"] = 0 print("B",s["B"]) ----------------------------------- A 12 B -4 C 7 D 9 dtype: int64 0: 0 B 0
元素篩選
s[s > x],用於篩選 Series數組中元素值大於 x 的元素。
s = pd.Series([10, 5, -5, 12], index=["A", "B", "C", "D"]) print(s) print() print(s[s > 8]) -------------------------- A 10 B 5 C -5 D 12 dtype: int64 A 10 D 12 dtype: int64
元素運算
由於可將 Series 看作 np.narray的升級版,故在對象運算和數學函數時,兩者的表現均一樣。(加減乘除、取對數等等,不再進行過多演示
import pandas as pd s = pd.Series([12, 5, 4, 9]) print(s) s = s - 2 print(s) ------------------------- 0 12 1 5 2 4 3 9 dtype: int64 0 10 1 3 2 2 3 7 dtype: int64
元素去重
若要對 Series 對象進行去重,則需調用函數 unique(),注意,去重后順序可能發生變化。
import pandas as pd s = pd.Series([12, 5, 9, 4, 4, 5, 5]) print("去重前:",s.values) s = s.unique() print("去重后",s) -------------------------------------- 去重前: [12 5 9 4 4 5 5] 去重后 [12 5 9 4]
元素出現頻度
使用函數 $Series.value_counts() 即可計算其中元素的頻度。
s = pd.Series([12, 5, 5, 5, 1, 1, 2]) print(s.value_counts()) --------------------------------- 5 3 1 2 12 1 2 1 dtype: int64
所屬關係判斷
使用函數 Series.isin()即可進行判斷,另外,其也可以作爲一個篩選條件哦。
s = pd.Series([1, 5, 8, 10, 15]) print(s.isin([5,10])) print() print(s[s.isin([5, 10])]) -------------------------------------- 0 False 1 True 2 False 3 True 4 False dtype: bool 1 5 3 10 dtype: int64
NaN
NaN,即 Not a Number,儅進行數據處理時而其中某項屬性丟失時(或未收集到時)可以使用。另外,可配合 isnull() 和 notnull()進行食用。(不是
另外請注意,雖然在 Pandas裏介紹NaN,但其聲明是:np.NaN。
isnull() 是函數, isnull 可將其看作一種屬性,可以用於在元素篩選。
s = pd.Series([12, 5, np.NaN, 10]) print(s[pd.isnull]) print() print(s.isnull()) print() print(s.notnull()) ----------------------------------- 2 NaN dtype: float64 0 False 1 False 2 True 3 False dtype: bool 0 True 1 True 2 False 3 True dtype: bool
對象閒的運算
考慮到 Series 對象之間的運算,其實類似于 narray 裏的廣播機制,但不同的是,此處僅會有共同標簽(index)的屬性才會有結果,否則為 NaN(非數)。
s1 = pd.Series([10, 5, 2],index=["R", "G", "B"]) s2 = pd.Series([5, 2, 1],index=["G", "B", "F"]) print(s1 + s2) ---------------------------------- B 4.0 F NaN G 10.0 R NaN dtype: float64
DataFrame對象
DateFrame 實際上就是多維的 Series(也可以考慮為多個 Series 的組合)。其有兩個索引,行索引,和列索引(可把 DataFrame 中的列索引想作單個 Series 中的行索引)。
也可將 DataFrame 看作由 Series 組成的字典。
對象的聲明
可以通過一個字典 + 列表進行初始化。
my_dict = {"color":["R", "G", "B"], "object":["you", "me", "him"], "value":[1, 3, 5]} frame = pd.DataFrame(my_dict,index=["A", "B", "C"]) print(frame) ------------------------------------- color object value A R you 1 B G me 3 C B him 5
DataFrame 中存在屬性 clolumns,即可以達到對列表進行提純的作用,也可以在對 DataFrame 進行初始化時使用。
my_dict = {"color":["R", "G", "B"], "object":["you", "me", "him"], "value":[1, 3, 5]} frame = pd.DataFrame(my_dict, columns=["color","value"]) print(frame) ------------------------------------- color value 0 R 1 1 G 3 2 B 5
frame = pd.DataFrame(np.arange(25).reshape(5, 5), columns=["A", "B", "C", "D", "E"], index=["1", "2", "3", "4", "5"]) print(frame) ------------------------------------ A B C D E 1 0 1 2 3 4 2 5 6 7 8 9 3 10 11 12 13 14 4 15 16 17 18 19 5 20 21 22 23 24
對象操作
元素選取
考慮到 DataFrames 存在著許多屬性,因此有許多方法可以對元素進行選取。
DataFrame.columns: 獲取所有列的名稱(其實就是最上面那一排)
dict_data = {"color":["R", "G", "B"], "object":["pen","pan","pencil"], "value":[100, 200, 300]} frame = pd.DataFrame(dict_data) print(frame.columns) -------------------------------- Index(['color', 'object', 'value'], dtype='object')
DataFrame.values:獲取其中的每個元素,以列表存儲。([列名1_1,列名1_2,…],[],…)
dict_data = {"color":["R", "G", "B"], "object":["pen","pan","pencil"], "value":[100, 200, 300]} frame = pd.DataFrame(dict_data) print(frame.values) ------------------------------------------ [['R' 'pen' 100] ['G' 'pan' 200] ['B' 'pencil' 300]]
DataFrame.index:獲取行索引(其實就是最左邊竪著的那一排啦~)
dict_data = {"color":["R", "G", "B"], "object":["pen","pan","pencil"], "value":[100, 200, 300]} frame = pd.DataFrame(dict_data) print(frame.index) ------------------------------------- RangeIndex(start=0, stop=3, step=1)
直接通過索引進行獲取(既然是[],肯定能通過這種方式獲取拉~)
dict_data = {"color":["R", "G", "B"], "object":["pen","pan","pencil"], "value":[100, 200, 300]} frame = pd.DataFrame(dict_data) print(frame["value"]) print() print(frame.loc[1]) print() print(frame["object"][1]) ---------------------------- 0 100 1 200 2 300 Name: value, dtype: int64 color G object pan value 200 Name: 1, dtype: object pan
多行選取(即數組的切片操作)
此處需注意,frame[0:2]為正確操作,而frame[0]則為錯誤操作哦!
dict_data = {"color":["R", "G", "B"], "object":["pen","pan","pencil"], "value":[100, 200, 300]} frame = pd.DataFrame(dict_data) print(frame[0:2]) --------------------------------- color object value 0 R pen 100 1 G pan 200
元素賦值
部分值的賦值如同 Series 對象,但在 DataFrame 這裏還有添加列的操作哦~
ps:不能理解爲什麽此處 A 在前面┭┮﹏┭┮
frame = pd.DataFrame(np.arange(25).reshape(5, 5), columns=["A", "B", "C", "D", "E"], index=["a", "b", "c", "d", "e"]) frame["A"]["a"] = 100 print(frame) ------------------------------- A B C D E a 100 1 2 3 4 b 5 6 7 8 9 c 10 11 12 13 14 d 15 16 17 18 19 e 20 21 22 23 24
添加新的列。簡單的使用 frame[] = [],即可,類似於字典的添加操作。
不過請注意保持元素的個數一致哦~
frame = pd.DataFrame(np.arange(25).reshape(5, 5), columns=["A", "B", "C", "D", "E"], index=["a", "b", "c", "d", "e"]) frame["hahaha!"] = [1, 2, 3, 4, 5] print(frame) --------------------------- A B C D E hahaha! a 0 1 2 3 4 1 b 5 6 7 8 9 2 c 10 11 12 13 14 3 d 15 16 17 18 19 4 e 20 21 22 23 24 5
所屬關係
大致與 Series 中的相同,不在過多闡釋。
(ps:可以看上下的結果對比一下哦
frame = pd.DataFrame(np.arange(25).reshape(5, 5), columns=["A", "B", "C", "D", "E"], index=["a", "b", "c", "d", "e"]) print(frame.isin([4, 1])) ------------------------------------ A B C D E hahaha! a False True False False True True b False False False False False False c False False False False False False d False False False False False True e False False False False False False
元素篩選
同上。(看看代碼即可
frame = pd.DataFrame(np.arange(25).reshape(5, 5), columns=["A", "B", "C", "D", "E"], index=["a", "b", "c", "d", "e"]) print(frame[frame >= 20]) #此處可能數組名亦可代表每個元素的變量名(不是很懂 ------------------------------------- A B C D E hahaha! a NaN NaN NaN NaN NaN NaN b NaN NaN NaN NaN NaN NaN c NaN NaN NaN NaN NaN NaN d NaN NaN NaN NaN NaN NaN e 20.0 21.0 22.0 23.0 24.0 NaN
刪除列
调用 del DataFrame[列名] 即可。(应用广泛,但也说明一下)
frame = pd.DataFrame(np.arange(25).reshape(5, 5), columns=["A", "B", "C", "D", "E"], index=["a", "b", "c", "d", "e"]) del frame["A"] print(frame) ----------------------------- B C D E a 1 2 3 4 b 6 7 8 9 c 11 12 13 14 d 16 17 18 19 e 21 22 23 24
转置
调用 DataFrame 中的属性 T即可进行轉置。
frame = pd.DataFrame(np.arange(25).reshape(5, 5), columns=["A", "B", "C", "D", "E"], index=["a", "b", "c", "d", "e"]) print(frame.T) --------------------------- a b c d e B 1 6 11 16 21 C 2 7 12 17 22 D 3 8 13 18 23 E 4 9 14 19 24
Index對象
Index對象即是上文所使用的數組的軸(橫、竪)。
方法使用
獲取索引的最小值, XXX.idxmin()。
s = pd.Series([5, 10, 15, 20],index=["a1", "b2", "c3", "d4"]) print(s.index) print(s.idxmin()) --------------------------- Index(['a1', 'b2', 'c3', 'd4'], dtype='object') a1
獲取索引的最大值, XXX.idxmax()。
ps:比較方法即對各個字符串進行比較,字符串之間的比較方法不再進行過多的闡釋。
s = pd.Series([5, 10, 15, 20],index=["a1", "b2", "c3", "d4"]) print(s.index) print(s.idxmax()) ---------------------------------------- Index(['a1', 'b2', 'c3', 'd4'], dtype='object') d4
索引更換
當你對數組中當前的索引不滿意時,可以用 reindex() 函數來更換對象的索引。
另外,若增加了新的索引,會添加NaN作爲新索引的數值。
(再另外,爲什麽不開始就初始化令您滿意的索引呢(不是
s = pd.Series([5, 10, 15, 20],index=["a1", "b2", "c3", "d4"]) print(s) s = s.reindex(["a1", "B", "c3", "D","d4"]) print(s) ----------------------------- a1 5 b2 10 c3 15 d4 20 dtype: int64 a1 5.0 B NaN c3 15.0 D NaN d4 20.0 dtype: float64
reindex() 具有參數 method,即是參數的填補方法。
若 method = “ffill”,即 front fill,用前一個下標來對當前的 NaN 的值進行填充。
method = “bfill”,即back fill,于上描述相反。
frame = pd.DataFrame(np.arange(9).reshape(3, 3),columns=["A", "B", "C"], index=["a", "b", "c"]) print(frame) frame = frame.reindex(["a", "d", "daa!", "b"],method="ffill") print(frame) ------------------------------------------ A B C a 0 1 2 b 3 4 5 c 6 7 8 A B C a 0 1 2 d 6 7 8 daa! 6 7 8 b 3 4 5
或,可直接使用 fill_value = 0,即將默認的NaN 填充為 0。
(這個就不再進行演示了≡(▔﹏▔)≡
刪除索引
同 del Array[] 相同,不過這裏是換了另外一個函數 .drop() 進行處理。
ps:Series(DataFrame亦是)似乎為不可變對象,因此要使用s = s.drop(“A”),而非單單的 s.drop(“A”)。請謹記。
s = pd.Series(np.arange(4), index=["A", "B", "C", "d"]) print(s) print() s = s.drop("A") print(s) -------------------------- A 0 B 1 C 2 d 3 dtype: int32 B 1 C 2 d 3 dtype: int32
數據對齊
與 Series 之間進行相加一樣,礙於篇幅過長,不再進行闡釋。
數據結構之間的運算
數據結構之間可直接通過算數運算符進行運算,當然也可以通過下列的方法達到相同的目的。
add()
sub()
div ()
sub()
字如其人,不再解釋。
運算
通過加法來對運算的原理進行演示。
注意,這裏的 Series 對齊的是 DataFrame 裏的列名稱(columns) 而非 index。
frame = pd.DataFrame(np.arange(9).reshape(3, 3), index = ["A", "B", "C"], columns=["a", "b", "c"]) ser = pd.Series(np.arange(3), index=["a", "b", "c"]) print(frame + ser) ------------------------------- a b c A 0 2 4 B 3 5 7 C 6 8 10
其餘運算也與上述的演示同理。
函數應用和映射
通用函數
平方根
np.sqrt() 可以求序列中每個元素的平方根。
frame = pd.DataFrame(np.arange(9).reshape(3, 3), columns=["A", "B", "C"], index=["a", "B", "c"]) print(np.sqrt(frame)) -------------------------------------------- A B C a 0.000000 1.000000 1.414214 B 1.732051 2.000000 2.236068 c 2.449490 2.645751 2.828427
求和與平均值
np.sum() 用於求序列的元素之和, np.mean() 用於求序列的平均值。其中,更牛逼的要數 .describe()。
frame = pd.DataFrame(np.arange(9).reshape(3, 3), columns=["A", "B", "C"], index=["a", "B", "c"]) print(np.sum(frame)) print() print(np.mean(frame)) print() print(frame.describe()) ------------------------------ A 9 B 12 C 15 dtype: int64 A 3.0 B 4.0 C 5.0 dtype: float64 A B C count 3.0 3.0 3.0 mean 3.0 4.0 5.0 std 3.0 3.0 3.0 min 0.0 1.0 2.0 25% 1.5 2.5 3.5 50% 3.0 4.0 5.0 75% 4.5 5.5 6.5 max 6.0 7.0 8.0
相關性
通過DataFrame.corr() 即可實現。
frame = pd.DataFrame(np.arange(25).reshape(5, 5), columns = ["B", "C", "A", "D", "E"], index=["a", "c", "b", "d", "e"]) print(frame.corr()) ---------------------------- B C A D E B 1.0 1.0 1.0 1.0 1.0 C 1.0 1.0 1.0 1.0 1.0 A 1.0 1.0 1.0 1.0 1.0 D 1.0 1.0 1.0 1.0 1.0 E 1.0 1.0 1.0 1.0 1.0
協方差
簡單的通過 .cov() 即可實現。(請不要再自己手寫函數了!
frame = pd.DataFrame(np.arange(25).reshape(5, 5), columns = ["B", "C", "A", "D", "E"], index=["a", "c", "b", "d", "e"]) print(frame.cov()) ------------------------------- B C A D E B 62.5 62.5 62.5 62.5 62.5 C 62.5 62.5 62.5 62.5 62.5 A 62.5 62.5 62.5 62.5 62.5 D 62.5 62.5 62.5 62.5 62.5 E 62.5 62.5 62.5 62.5 62.5
排序和排次
通過函數 DataFrame.sort_index() 進行排序,其有兩個參數, ascending,用於指定按照降序(False),還是按照升序(True 且為默認值)排列; $axis,axis = 0時按照列進行排列(且爲默認值), axis = 1時按照行進行排列。
注意,這裏説的排列均是針對 Index 而非其中的 Value。
frame = pd.DataFrame(np.arange(25).reshape(5, 5), columns = ["B", "C", "A", "D", "E"], index=["a", "c", "b", "d", "e"]) print(frame) print() print(frame.sort_index(ascending=False)) print() print(frame.sort_index(axis=1)) ---------------------------------------------- B C A D E a 0 1 2 3 4 c 5 6 7 8 9 b 10 11 12 13 14 d 15 16 17 18 19 e 20 21 22 23 24 B C A D E e 20 21 22 23 24 d 15 16 17 18 19 c 5 6 7 8 9 b 10 11 12 13 14 a 0 1 2 3 4 A B C D E a 2 0 1 3 4 c 7 5 6 8 9 b 12 10 11 13 14 d 17 15 16 18 19 e 22 20 21 23 24
當然,也可以基於你給定的列進行排序,如:sort_values(by = [“A”, “B”]),結果就不再進行演示了。
排位次操作
通過 DataFrame.rank() 以達到安排位次的目的(不過實際意義鄙人尚且不能理解。
frame = pd.DataFrame(np.arange(25).reshape(5, 5), columns = ["B", "C", "A", "D", "E"], index=["a", "c", "b", "d", "e"]) print(frame.rank()) -------------------------------------- B C A D E a 1.0 1.0 1.0 1.0 1.0 c 2.0 2.0 2.0 2.0 2.0 b 3.0 3.0 3.0 3.0 3.0 d 4.0 4.0 4.0 4.0 4.0 e 5.0 5.0 5.0 5.0 5.0
NaN數據
NaN過濾
.dropna() 和 notnull() 篩選 即可以實現過濾掉 NaN 元素的目的。
在使用 dropna() 時需注意,可能會存在整行或整列均爲 NaN 的情況,則需要對 how 參數變量進行設置。 若 how = “any”,則只要有缺省值出現,就會刪除行或列,若 how = “all”,則只有所有值為 NaN時,才刪除。
frame = pd.DataFrame([[1, 2, 3], [np.nan, np.nan, np.nan], [4, 5, 6]] ,columns=["A", "B", "C"], index=["a", "b", "c"]) print(frame) print() print(frame.dropna(how="all")) -------------------------------------- A B C a 1.0 2.0 3.0 b NaN NaN NaN c 4.0 5.0 6.0 A B C a 1.0 2.0 3.0 c 4.0 5.0 6.0
填充NaN
使用 .fillna(x)即可將序列裏的 NaN 變換為 x 值哦~
frame = pd.DataFrame([[1, 2, 3], [np.nan, np.nan, np.nan], [4, 5, 6]] ,columns=["A", "B", "C"], index=["a", "b", "c"]) print(frame) print() print(frame.fillna(0)) ------------------------------------ A B C a 1.0 2.0 3.0 b NaN NaN NaN c 4.0 5.0 6.0 A B C a 1.0 2.0 3.0 b 0.0 0.0 0.0 c 4.0 5.0 6.0
層級順序的調整
(太複雜且不常用,略了吧。。。。
这篇关于python Pandas庫的學習的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-14获取参数学习:Python编程入门教程
- 2024-11-14Python编程基础入门
- 2024-11-14Python编程入门指南
- 2024-11-13Python基础教程
- 2024-11-12Python编程基础指南
- 2024-11-12Python基础编程教程
- 2024-11-08Python编程基础与实践示例
- 2024-11-07Python编程基础指南
- 2024-11-06Python编程基础入门指南
- 2024-11-06怎么使用python 计算两个GPS的距离功能-icode9专业技术文章分享