分組計算:
Group By : split – apply – combine
split: 很具某些條件對數(shù)據(jù)進(jìn)行分組
apply:對每一個group獨(dú)立的應(yīng)用函數(shù)
combine:將結(jié)果數(shù)據(jù)組合到某種數(shù)據(jù)結(jié)構(gòu)中
1 2 3 4 5 | pokemon = pd.read_csv( 'Pokemon.csv' ) #讀文件
pokemon[ 'Type 1' ].value_counts()
# 分組 groupby
grouped1 = pokemon.groupby( 'Type 1' )
|
計算:
1.求平均 .mean()

2.單個求平均

3.求和
4.求中位數(shù)
1 | grouped2 = pokemon.groupby([ 'Type 1' , 'Type 2' ])
|
計算中,應(yīng)用多個函數(shù)
1 | grouped2.aggregate(np.mean)
|

1 | grouped2.aggregate([np.mean,np.median])
|

針對不同的列:
1 | grouped2.aggregate([np.mean,np.median,np. sum ])[ 'HP' ]
|

不同的列:用不同函數(shù)
1 2 3 | grouped2.agg({ 'HP' :np.mean, 'Attack' :np.median})
grouped2.agg({ 'HP' :np.mean, 'Attack' :[np.median,np. sum ]})
|

查看大小:

查看具體分組:

獲得某一組:
1 | grouped2.get_group(( 'Normal' , 'Ground' )) #填寫元組
|
計算每個組大小:
1 2 3 | for name,group in grouped2:
print (name)
print (group.shape)
|

對數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化:(防止數(shù)值過大)
數(shù)值型: 該列,每一個減去平均數(shù) 除以 該列標(biāo)準(zhǔn)差
1 2 3 | zscore = lambda s : ( s - s.mean() ) / s.std()
grouped1.transform(zscore)
|

過濾:
1 2 3 4 5 | # 假設(shè)要求每個組別樣本小于10
cond1 = lambda s : len (s)< 10
grouped2. filter (cond1).shape
|

前情:設(shè)置索引:
1 | pok1 = pokemon.set_index([ 'Type 1' , 'Type 2' ])
|

按索引進(jìn)行分組:
1 2 3 4 | pok1.groupby(level = [ 0 ])
pok1.groupby(level = [ 0 , 1 ])
pok1.groupby(level = [ 'Type 1' , 'Type 2' ])
|

多表操作:

View Code
數(shù)據(jù)表操作:組合

1 | pd.concat([df1,df2],axis = 1 ) # axis =1 設(shè)置軸根據(jù)索引組合 =0按列名
|

類似方法
1 | df1.append(df2) # append只能填一個參數(shù)!
|
主角,主鍵講解:

View Code
1 2 3 4 5 | # how 組合方式 默認(rèn)inner outer = 相等連接
# on = 左右兩邊 用什么key連接
# 根據(jù)key1 設(shè)置join組合
pd.merge(left,right,on = 'key1' ,how = 'inner' )
|

1 | pd.merge(left,right,on = [ 'key1' , 'key2' ])
|

1 | pd.merge(left,right,on = [ 'key1' , 'key2' ],how = 'left' )
|

重命名:
1 | right1 = right.rename(columns = { 'key1' : 'new_key1' , 'key2' : 'new_key2' })
|
主鍵名字不一樣的組合:
1 | pd.merge(left,right1,left_on = [ 'key1' , 'key2' ],right_on = [ 'new_key1' , 'new_key2' ],how = 'left' )
|

索引位與列的組合:

前提設(shè)置
1 2 3 | # left_index,right_index默認(rèn)False, 改為True 表示左邊數(shù)據(jù)集使用索引位
pd.merge(left_Index,right1,left_index = True ,right_on = [ 'new_key1' , 'new_key2' ],how = 'left' )
|

csv文件中,沒有列名.需要自己定義!
1 | user_info = pd.read_csv( 'user_info_train.txt' ,header = None , names = [ 'id' , 'sex' , 'job' , 'education' , 'marriage' , 'hukou' ]) # 注意names
|
查看唯一值:
1 2 3 | id = user_info[ 'id' ]
id .unique()
len ( id .unique())
|

行變列顯示:
1 2 3 4 5 | a = grouped3[ 'amountOfTrans' ]. sum ()
a.unstack()
# stack() 與unstack() 逆操作!!
# a.stack() a.unstack()
|
 
rename:
1 | a.rename(columns = {a.columns[ 0 ]: 'shouru' ,a.columns[ 1 ]: 'zhichu' },inplace = True )
|
直接運(yùn)算:
1 | a[ 'diff' ] = a[ 'shouru' ] - a[ 'zhichu' ]
|

透視表:
1 2 3 | pd.pivot_table(data = pokemon , index = 'Type 1' , columns = 'Type 2' , values = [ 'HP' , 'Total' ],aggfunc = [np. sum ])
pd.pivot_table(data = pokemon , index = 'Type 1' , columns = 'Type 2' , values = [ 'HP' , 'Total' ],aggfunc = [np. sum ,np.mean])
|
交互表:
計算頻率:
1 2 3 | pd.crosstab(index = pokemon[ 'Type 1' ],columns = pokemon[ 'Type 2' ] )
pd.crosstab(index = pokemon[ 'Type 1' ],columns = pokemon[ 'Type 2' ] ,margins = True ) # margins 顯示總頻率
|

dummy variables
沒有意義的類別,不需要比較的數(shù)據(jù)
1 2 3 4 | #在Type1的類別中,有且唯有一個 1
pd.get_dummies(data = pokemon,columns = [ 'Type 1' ])
pd.get_dummies(data = pokemon,columns = [ 'Type 1' , 'Type 2' ])
|

|