文章目錄 pandas基本數據結構 Series:通過一維數組創建 Series值的獲取 Series的運算 Series缺失值檢測 Series自動對齊 Series及其索引的name屬性 DataFrame: 通過二維數組創建 DataFrame: 通過字典的方式創建 索引對象 DataFrame數據獲取 pandas基本功能 pandas:數據文件讀取 pandas:數據過濾獲取 pandas:缺省值NaN處理方法 pandas:常用的數學統計方法 pandas:唯一值、值計數以及成員資格 pandas:層次索引 pandas:按照層次索引進行統計數據
pandas基本數據結構
pandas中主要有兩種數據結構,分別是:Series和DataFrame。 Series:一種類似于一維數組的對象,是由一組數據(各種NumPy數據類型)以及一組與之相關的數據標簽(即索引)組成。僅由一組數據也可產生簡單的Series對象。注意:Series中的索引值是可以重復的。 DataFrame:一個表格型的數據結構,包含有一組有序的列,每列可以是不同的值類型(數值、字符串、布爾型等),DataFrame即有行索引也有列索引,可以被看做是由Series組成的字典。
Series:通過一維數組創建
import numpy
as np
from pandas
import Series
, DataFrame
import pandas
as pd
arr
= np
. array
( [ 1 , 3 , 5 , np
. NaN
, 10 ] )
series01
= Series
( arr
)
series01
0 1.0
1 3.0
2 5.0
3 NaN
4 10.0
dtype: float64
series02
= Series
( [ 87 , 90 , 89 ] )
series02
0 87
1 90
2 89
dtype: int64
series02
. index
= [ u
'語文' , u
'數學' , u
'英語' ]
series02
語文 87
數學 90
英語 89
dtype: int64
series03
= Series
( data
= [ 87 , 90 , 89 ] , dtype
= np
. float64
, index
= [ u
'語文' , u
'數學' , u
'英語' ] )
series03
語文 87.0
數學 90.0
英語 89.0
dtype: float64
dict1
= { 'name' : 'Twiss' , 'university' : 'CMU' , 'degree' : 'graduate' }
series04
= Series
( dict1
)
series04
name Twiss
university CMU
degree graduate
dtype: object
Series值的獲取
Series值的獲取主要有兩種方式:
通過方括號+索引的方式讀取對應索引的數據,有可能返回多條數據 通過方括號+下標值的方式讀取對應下標值的數據,下標值的取值范圍為:[0,len(Series.values));另外下標值也可以是負數,表示從右往左獲取數據
Series獲取多個值的方式類似NumPy中的ndarray的切片操作,通過方括號+下標值/索引值+冒號(:)的形式來截取series對象中的一部分數據。
Series的運算
NumPy中的數組運算,在Series中都保留了,均可以使用,并且Series進行數組運算的時候,索引與值之間的映射關系不會發生改變。 注意:其實在操作Series的時候,基本上可以把Series看成NumPy中的ndarray數組來進行操作。ndarray數組的絕大多數操作都可以應用到Series上。
series
= Series
( { '001' : 879 , '002' : 888 , '003' : 897 } )
series
001 879
002 888
003 897
dtype: int64
series
[ series
> 880 ]
002 888
003 897
dtype: int64
series
/ 100
001 8.79
002 8.88
003 8.97
dtype: float64
series2
= Series
( [ - 1 , - 2 , 3 , 4 ] )
series2
0 -1
1 -2
2 3
3 4
dtype: int64
np
. exp
( series2
)
0 0.367879
1 0.135335
2 20.085537
3 54.598150
dtype: float64
np
. fabs
( series2
)
0 1.0
1 2.0
2 3.0
3 4.0
dtype: float64
Series缺失值檢測
scores
= Series
( { "Twiss" : 90 , "Evan" : 89 , "Iran" : 86 } )
scores
Twiss 90
Evan 89
Iran 86
dtype: int64
new_index
= [ "Twiss" , "Max" , "Evan" , "Iran" ]
scores
= Series
( scores
, index
= new_index
)
scores
Twiss 90.0
Max NaN
Evan 89.0
Iran 86.0
dtype: float64
pandas中的isnull和notnull兩個函數可以用于在Series中檢測缺失值,這兩個函數的返回時一個布爾類型的Series
pd
. isnull
( scores
)
Twiss False
Max True
Evan False
Iran False
dtype: bool
pd
. notnull
( scores
)
Twiss True
Max False
Evan True
Iran True
dtype: bool
scores
[ pd
. isnull
( scores
) ]
Max NaN
dtype: float64
scores
[ pd
. notnull
( scores
) ]
Twiss 90.0
Evan 89.0
Iran 86.0
dtype: float64
Series自動對齊
當多個series對象之間進行運算的時候,如果不同series之間具有不同的索引值,那么運算會自動對齊不同索引值的數據,如果某個series沒有某個索引值,那么最終結果會賦值為NaN。
s1
= Series
( [ 12 , 23 , 45 ] , index
= [ 'p1' , 'p2' , 'p3' ] )
s2
= Series
( [ 54 , 43 , 32 , 21 ] , index
= [ 'p2' , 'p3' , 'p4' , 'p5' ] )
s1
+ s2
p1 NaN
p2 77.0
p3 88.0
p4 NaN
p5 NaN
dtype: float64
s1
* s2
p1 NaN
p2 1242.0
p3 1935.0
p4 NaN
p5 NaN
dtype: float64
s1
/ s2
p1 NaN
p2 0.425926
p3 1.046512
p4 NaN
p5 NaN
dtype: float64
Series及其索引的name屬性
Series對象本身以及索引都具有一個name屬性,默認為空,根據需要可以進行賦值操作
scores
= Series
( { "Twiss" : 99 , "Evan" : 88 , "Iran" : 85 } )
scores
. name
= u
'語文'
scores
. index
. name
= u
'考試成績'
scores
考試成績
Twiss 99
Evan 88
Iran 85
Name: 語文, dtype: int64
DataFrame: 通過二維數組創建
df01
= DataFrame
( [ "Twiss" , "Rvan" , "Wind" ] , [ 99 , 70 , 88 ] )
df01
df02
= DataFrame
( [ [ 'Twiss' , 99 ] , [ 'Rvan' , 70 ] , [ 'Wind' , 88 ]
] , columns
= [ u
'姓名' , u
'成績' ] )
df02
姓名成績 0Twiss 99 1Rvan 70 2Wind 88
df02
. columns
Index(['姓名', '成績'], dtype='object')
df02
. index
RangeIndex(start=0, stop=3, step=1)
df02
. values
array([['Twiss', 99],['Rvan', 70],['Wind', 88]], dtype=object)
DataFrame: 通過字典的方式創建
data
= { "name" : [ "Twiss" , "Evan" , "Wind" , "Like" , "Cliera" ] , "score" : [ 998 , 887 , 897 , 878 , 777 ] , "year" : 2019
}
df
= DataFrame
( data
)
df
namescoreyear 0Twiss 998 2019 1Evan 887 2019 2Wind 897 2019 3Like 878 2019 4Cliera 777 2019
df
. index
= [ "one" , "two" , "three" , "four" , "five" ]
df
namescoreyear oneTwiss 998 2019 twoEvan 887 2019 threeWind 897 2019 fourLike 878 2019 fiveCliera 777 2019
索引對象
不管是Series還是DataFrame對象,都有索引對象。 索引對象負責管理軸標簽和其它元數據(eg:軸名稱等等) 通過索引可以從Series、DataFrame中獲取值或者對某個索引值進行重新賦值 Series或者DataFrame的自動對齊功能是通過索引實現的
DataFrame數據獲取
可以直接通過列索引獲取指定列的數據, eg: df[column_name] 如果需要獲取指定行的數據的話,需要通過ix方法來獲取對應行索引的行數據,eg: df.ix[index_name]
df
namescoreyear oneTwiss 998 2019 twoEvan 887 2019 threeWind 897 2019 fourLike 878 2019 fiveCliera 777 2019
df
[ "year" ]
one 2019
two 2019
three 2019
four 2019
five 2019
Name: year, dtype: int64
df
. loc
[ 'one' ]
name Twiss
score 998
year 2019
Name: one, dtype: object
df
[ 'score' ] = [ 990 , 888 , 890 , 870 , 770 ]
df
[ 'university' ] = np
. NaN
df
. loc
[ 'five' ] = np
. NaN
df
namescoreyearuniversity oneTwiss 990.0 2019.0 NaN twoEvan 888.0 2019.0 NaN threeWind 890.0 2019.0 NaN fourLike 870.0 2019.0 NaN fiveNaN NaN NaN NaN
pandas基本功能
數據文件讀取/文本數據讀取 索引、選取和數據過濾 算法運算和數據對齊 函數的應用和映射 重置索引
pandas:數據文件讀取
通過pandas提供的read_xxx相關的函數可以讀取文件中的數據,并形成DataFrame,常用的數據讀取方法為:read_csv,主要可以讀取文本類型的數據
df
= pd
. read_csv
( "data1.csv" )
df
nameagescore 0Twiss 24 99 1Wind 22 98 2Evan 25 97
df
= pd
. read_csv
( "data2.text" , sep
= ';' , header
= None )
df
01234 0Twiss 24 99 98 78 1Wind 25 98 97 77 2Evan 22 97 55 67
pandas:數據過濾獲取
通過DataFrame的相關方式可以獲取對應的列或者數據形成一個新的DataFrame, 方便后續進行統計計算。
columns
= [ 'name' , 'age' , u
'高等數學' , u
'線性代數' , u
'離散數學' ]
df
. columns
= columns
df
nameage高等數學線性代數離散數學 0Twiss 24 99 98 78 1Wind 25 98 97 77 2Evan 22 97 55 67
pandas:缺省值NaN處理方法
對于DataFrame/Series中的NaN一般采取的方式為刪除對應的列/行或者填充一個默認值
dropna:根據標簽的值中是否存在缺失數據對軸標簽進行過濾(刪除), 可以通過閾值的調節對缺失值的容忍度 fillna:用指定值或者插值的方式填充缺失數據,比如: ffill或者bfill isnull:返回一個含有布爾值的對象,這些布爾值表示那些值是缺失值NA notnull: isnull的否定式
df2
= DataFrame
( [ [ 'Twiss' , np
. NaN
, 667 , 'M' ] , [ 'JackSon' , np
. NaN
, np
. NaN
, np
. NaN
] , [ 'Evan' , 23 , np
. NaN
, 'M' ] , [ 'Wind' , 18 , 555 , 'F' ]
] , columns
= [ 'name' , 'age' , 'salary' , 'gender' ] )
df2
nameagesalarygender 0Twiss NaN 667.0 M 1JackSon NaN NaN NaN 2Evan 23.0 NaN M 3Wind 18.0 555.0 F
df2
. isnull
( )
nameagesalarygender 0False True False False 1False True True True 2False False True False 3False False False False
df2
. notnull
( )
nameagesalarygender 0True False True True 1True False False False 2True True False True 3True True True True
df2
. dropna
( )
nameagesalarygender 3Wind 18.0 555.0 F
df2
. dropna
( how
= 'all' )
nameagesalarygender 0Twiss NaN 667.0 M 1JackSon NaN NaN NaN 2Evan 23.0 NaN M 3Wind 18.0 555.0 F
df2
. dropna
( axis
= 1 )
name 0Twiss 1JackSon 2Evan 3Wind
df
= DataFrame
( np
. random
. randn
( 7 , 3 ) )
df
. loc
[ : 4 , 1 ] = np
. nan
df
. loc
[ : 2 , 2 ] = np
. nan
df
012 0-0.393950 NaN NaN 1-1.449680 NaN NaN 2-1.000118 NaN NaN 3-0.825733 NaN -1.925034 42.357290 NaN -0.080654 5-0.622228 2.597366 -1.435983 60.979495 1.310981 -0.304767
df
. fillna
( 0 )
012 0-0.393950 0.000000 0.000000 1-1.449680 0.000000 0.000000 2-1.000118 0.000000 0.000000 3-0.825733 0.000000 -1.925034 42.357290 0.000000 -0.080654 5-0.622228 2.597366 -1.435983 60.979495 1.310981 -0.304767
df
. fillna
( { 1 : 0.5 , 2 : - 1 , 3 : 1 } )
012 0-0.393950 0.500000 -1.000000 1-1.449680 0.500000 -1.000000 2-1.000118 0.500000 -1.000000 3-0.825733 0.500000 -1.925034 42.357290 0.500000 -0.080654 5-0.622228 2.597366 -1.435983 60.979495 1.310981 -0.304767
pandas:常用的數學統計方法
count 計算非NA值的數量 describe 針對Series或各DataFrame列計算總統計值 min/max 計算最大值、最小值 idxmin、idxmax 計算能夠獲取到最小值和最大值的索引位置(整數) idxmin、idxmaxe’zui’da’zhi 計算能夠獲取到最小值和最大值的索引值 quantile 計算樣本的分位數(0到1) sum 值的總和 mean 值的平均數 median 值的中位數 mad 根據平均值計算平均絕對距離差 var 樣本數值的方差 std 樣本值的標準差 cumsum 樣本值的累計和 cummin、cummax 樣本的累計最小值、最大值 cumprod 樣本值的累計積 pct_change 計算百分數變化
df
= DataFrame
( { 'GDP' : [ 900 , 1000 , 1100 , 1200 , 1300 ] , 'Output_count' : [ 300 , 400 , 500 , 550 , 600 ] , 'Year' : [ '2012' , '2013' , '2014' , '2015' , '2016' ]
} )
df
GDPOutput_countYear 0900 300 2012 11000 400 2013 21100 500 2014 31200 550 2015 41300 600 2016
df
. cov
( )
GDPOutput_count GDP25000.0 18750.0 Output_count18750.0 14500.0
pandas:相關系數與協方差
協方差 如果有X,Y兩個變量,每個時刻的“X值與其均值之差”乘以“Y值與其均值之差”得到一個乘積,再對這每時刻的乘積求和并求出均值。 如果協方差為正,說明X,Y同向變化,協方差越大說明同向程度越高;如果協方差為負,說明X,Y反向運動,協方差越小說明反向程度越高。
df
[ 'GDP' ] . cov
( df
[ 'Output_count' ] )
18750.0
相關系數 就是用X、Y的協方差除以X的標準差和Y的標準差。所以,相關系數也可以看成協方差:一種剔除了兩個變量量綱影響、標準化后的特殊協方差。 1.也可以反映兩個變量變化時是同向還是反向,如果同向變化為正,反向變化為負 2.由于它是標準化后的協方差,因此更重的特性是,它消除了兩個變量變化幅度的影響,而只是單純反應兩個變量單位變化的相似程度。 注意: 相關系數不像協方差一樣可以在+∞+\infty + ∞ 到-∞-\infty - ∞ 間變化,它只能在+1到-1之間變化 當相關系數為1的時候兩者相識度最大,同向正相關 當相關系數為0的時候兩者沒有任何相似度,兩個變量無關
df
. corr
( )
GDPOutput_count GDP1.000000 0.984798 Output_count0.984798 1.000000
df
[ 'GDP' ] . corr
( df
[ 'Output_count' ] )
0.9847982464479191
pandas:唯一值、值計數以及成員資格
unique方法用于獲取Series中的唯一值數組(去重數據后的數組) value_counts方法用于計算一個Series中各值的出現頻率 isin方法用于判斷矢量化集合的成員資格,可用于選取Series中或者DataFrame中列中數據的子集
ser
= Series
( [ 'a' , 'b' , 'c' , 'a' ] )
ser
0 a
1 b
2 c
3 a
dtype: object
ser
. unique
( )
array(['a', 'b', 'c'], dtype=object)
df
= DataFrame
( { "order_id" : [ '1001' , '1002' , '1003' , '1004' , '1005' ] , "member_id" : [ 'm01' , 'm02' , 'm01' , 'm03' , 'mo4' ] , "order_amount" : [ 111 , 222 , 333 , 444 , 555 ]
} )
df
order_idmember_idorder_amount 01001 m01 111 11002 m02 222 21003 m01 333 31004 m03 444 41005 mo4 555
df
[ "member_id" ] . unique
( )
array(['m01', 'm02', 'm03', 'mo4'], dtype=object)
ser
. value_counts
( )
a 2
b 1
c 1
dtype: int64
ser
. value_counts
( ascending
= False )
a 2
b 1
c 1
dtype: int64
mask
= ser
. isin
( [ 'b' , 'c' ] )
mask
0 False
1 True
2 True
3 False
dtype: bool
ser
[ mask
]
1 b
2 c
dtype: object
pandas:層次索引
在某一個方向擁有多個(兩個及兩個以上)索引級別 通過層次化索引,pandas能夠以較低維度形式處理高緯度的數據 通過層次化索引,可以按照層次統計數據 層次索引包括Series層次索引和DataFrame層次索引
data
= pd
. Series
( [ 100 , 200 , 122 , 150 , 180 ] , index
= [ [ '2019' , '2019' , '2019' , '2018' , '2018' ] , [ 'apple' , 'banana' , 'orange' , 'apple' , 'orange' ] ] )
data
2019 apple 100banana 200orange 122
2018 apple 150orange 180
dtype: int64
data
[ '2019' ]
apple 100
banana 200
orange 122
dtype: int64
data
[ : , 'apple' ]
2019 100
2018 150
dtype: int64
data01
= data
. swaplevel
( ) . sort_index
( )
data01
apple 2018 1502019 100
banana 2019 200
orange 2018 1802019 122
dtype: int64
data02
= data
. unstack
( level
= 1 )
data02
applebananaorange 2018150.0 NaN 180.0 2019100.0 200.0 122.0
data02
= data
. unstack
( level
= 0 )
data02
20182019 apple150.0 100.0 bananaNaN 200.0 orange180.0 122.0
df
= DataFrame
( { 'year' : [ 2018 , 2018 , 2018 , 2019 , 2019 ] , 'fruit' : [ 'apple' , 'banana' , 'apple' , 'banana' , 'apple' ] , 'account' : [ 2345 , 3214 , 4444 , 5555 , 2234 ] , 'profit' : [ 111 , 222 , 333 , 444 , 555 ]
} )
df
yearfruitaccountprofit 02018 apple 2345 111 12018 banana 3214 222 22018 apple 4444 333 32019 banana 5555 444 42019 apple 2234 555
df
= df
. set_index
( [ 'year' , 'fruit' ] )
df
accountprofit yearfruit 2018apple2345 111 banana3214 222 apple4444 333 2019banana5555 444 apple2234 555
df
. loc
[ 2018 , 'banana' ]
/usr/local/Cellar/ipython/7.8.0/libexec/vendor/lib/python3.7/site-packages/ipykernel_launcher.py:1: PerformanceWarning: indexing past lexsort depth may impact performance."""Entry point for launching an IPython kernel.
accountprofit yearfruit 2018banana3214 222
pandas:按照層次索引進行統計數據
df
. sum ( level
= 'year' )
accountprofit year 201810003 666 20197789 999
df
. mean
( level
= 'fruit' )
accountprofit fruit apple3007.666667 333.0 banana4384.500000 333.0
df
. min ( level
= [ 'year' , 'fruit' ] )
accountprofit yearfruit 2018apple2345 111 banana3214 222 2019banana5555 444 apple2234 555
總結
以上是生活随笔 為你收集整理的[机器学习][基础编程][pandas]pandas基本操作 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。