python分组统计标准化_【Python数据分析】第二篇--数据计算

分组计算:

Group By : split – apply – combine

split: 很具某些条件对数据进行分组

apply:对每一个group独立的应用函数

combine:将结果数据组合到某种数据结构中

pokemon = pd.read_csv(‘Pokemon.csv‘) #读文件

pokemon[‘Type 1‘].value_counts()

# 分组 groupby

grouped1 = pokemon.groupby(‘Type 1‘)

计算:

1.求平均 .mean()

grouped1.mean()

20180110221027744052.jpg

2.单个求平均

grouped1[‘HP‘].mean()

20180110221027748935.jpg

3.求和

grouped1.sum()

4.求中位数

grouped1.median()

分组:方法二:多个

grouped2 = pokemon.groupby([‘Type 1‘, ‘Type 2‘])

计算中,应用多个函数

grouped2.aggregate(np.mean)

20180110221027750888.jpg

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

20180110221027755771.jpg

针对不同的列:

grouped2.aggregate([np.mean,np.median,np.sum])[‘HP‘]

20180110221027758701.jpg

不同的列:用不同函数

grouped2.agg({‘HP‘:np.mean,‘Attack‘:np.median})

grouped2.agg({‘HP‘:np.mean,‘Attack‘:[np.median,np.sum]})

20180110221027760654.jpg

查看大小:

grouped2.size()

20180110221027761631.jpg

查看具体分组:

grouped2.groups

20180110221027763584.jpg

获得某一组:

grouped2.get_group((‘Normal‘, ‘Ground‘)) #填写元组

20180110221027764561.jpg

计算每个组大小:

for name,group in grouped2:

print(name)

print(group.shape)

20180110221027765537.jpg

对数据进行标准化:(防止数值过大)

数值型: 该列,每一个减去平均数 除以 该列标准差

zscore = lambda s : ( s - s.mean() ) / s.std()

grouped1.transform(zscore)

20180110221027767491.jpg

过滤:

某些组别样本数过大!,需要剔除

# 假设要求每个组别样本小于10

cond1 = lambda s : len(s)<10

grouped2.filter(cond1).shape

20180110221027768467.jpg

前情:设置索引:

pok1 = pokemon.set_index([‘Type 1‘, ‘Type 2‘])

20180110221027770420.jpg

按索引进行分组:

pok1.groupby(level=[0])

pok1.groupby(level=[0,1])

pok1.groupby(level=[‘Type 1‘, ‘Type 2‘])

20180110221027772374.jpg

多表操作:

335b83df261c422459d4afc29ba290e5.png

d1b641f023dd079c9e4a800b96607d9d.gif

df1 =DataFrame({‘A‘:[‘A0‘,‘A1‘,‘A2‘,‘A3‘],‘B‘:[‘B0‘,‘B1‘,‘B2‘,‘B3‘],‘C‘:[‘C0‘,‘C1‘,‘C2‘,‘C3‘],‘D‘:[‘D0‘,‘D1‘,‘D2‘,‘D3‘],

},

index=[0,1,2,3])

df2=DataFrame({‘A‘:[‘A4‘,‘A5‘,‘A6‘,‘A7‘],‘B‘:[‘B4‘,‘B5‘,‘B6‘,‘B7‘],‘C‘:[‘C4‘,‘C5‘,‘C6‘,‘C7‘],‘D‘:[‘D4‘,‘D5‘,‘D6‘,‘D7‘],

},

index=[4,5,6,7])

df3=DataFrame({‘A‘:[‘A8‘,‘A9‘,‘A10‘,‘A11‘],‘B‘:[‘B8‘,‘B9‘,‘B10‘,‘B11‘],‘C‘:[‘C8‘,‘C9‘,‘C10‘,‘C11‘],‘D‘:[‘D9‘,‘D9‘,‘D10‘,‘D11‘],

},

index=[8,9,10,11])

View Code

数据表操作:组合

pd.concat([df1,df2])

20180110221027776280.jpg

pd.concat([df1,df2],axis=1) # axis =1 设置轴根据索引组合 =0按列名

20180110221027778233.jpg

类似方法

df1.append(df2) # append只能填一个参数!

主角,主键讲解:

335b83df261c422459d4afc29ba290e5.png

d1b641f023dd079c9e4a800b96607d9d.gif

left = DataFrame({‘key1‘: [‘K0‘,‘K0‘,‘K1‘,‘K2‘],‘key2‘: [‘K0‘,‘K1‘,‘K0‘,‘K1‘],‘A‘: [‘A0‘,‘A1‘,‘A2‘,‘A3‘],‘B‘: [‘B0‘,‘B1‘,‘B2‘,‘B3‘],

})

right= DataFrame({‘key1‘: [‘K0‘,‘K1‘,‘K1‘,‘K2‘],‘key2‘: [‘K0‘,‘K0‘,‘K0‘,‘K0‘],‘C‘: [‘C0‘,‘C1‘,‘C2‘,‘C3‘],‘D‘: [‘D0‘,‘D1‘,‘D2‘,‘D3‘],

})

View Code

# how 组合方式 默认inner outer = 相等连接

# on = 左右两边 用什么key连接

# 根据key1 设置join组合

pd.merge(left,right,on=‘key1‘,how=‘inner‘)

20180110221027781163.jpg

pd.merge(left,right,on=[‘key1‘,‘key2‘])

20180110221027782140.jpg

pd.merge(left,right,on=[‘key1‘,‘key2‘],how=‘left‘)

20180110221027783116.jpg

重命名:

right1 = right.rename(columns={‘key1‘:‘new_key1‘,‘key2‘:‘new_key2‘})

主键名字不一样的组合:

pd.merge(left,right1,left_on=[‘key1‘,‘key2‘],right_on=[‘new_key1‘,‘new_key2‘],how=‘left‘)

20180110221027785069.jpg

索引位与列的组合:

335b83df261c422459d4afc29ba290e5.png

d1b641f023dd079c9e4a800b96607d9d.gif

left_Index = left.set_index([‘key1‘,‘key2‘])

前提设置

# left_index,right_index默认False, 改为True 表示左边数据集使用索引位

pd.merge(left_Index,right1,left_index=True,right_on=[‘new_key1‘,‘new_key2‘],how=‘left‘)

20180110221027786046.jpg

csv文件中,没有列名.需要自己定义!

user_info = pd.read_csv(‘user_info_train.txt‘,header = None , names = [‘id‘,‘sex‘,‘job‘,‘education‘,‘marriage‘,‘hukou‘]) # 注意names

查看唯一值:

id = user_info[‘id‘]

id.unique()

len(id.unique())

20180110221027787999.jpg

行变列显示:

a = grouped3[‘amountOfTrans‘].sum()

a.unstack()

# stack() 与unstack() 逆操作!!

# a.stack() a.unstack()

20180110221027791906.jpg

20180110221027793859.jpg

rename:

a.rename(columns = {a.columns[0]:‘shouru‘,a.columns[1]:‘zhichu‘},inplace=True)

直接运算:

a[‘diff‘] = a[‘shouru‘] - a[‘zhichu‘]

20180110221027797765.jpg

透视表:

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])

交互表:

计算频率:

pd.crosstab(index = pokemon[‘Type 1‘],columns= pokemon[‘Type 2‘] )

pd.crosstab(index = pokemon[‘Type 1‘],columns= pokemon[‘Type 2‘] ,margins=True) # margins 显示总频率

20180110221027802648.jpg

dummy variables

没有意义的类别,不需要比较的数据

#在Type1的类别中,有且唯有一个 1

pd.get_dummies(data=pokemon,columns=[‘Type 1‘])

pd.get_dummies(data=pokemon,columns=[‘Type 1‘,‘Type 2‘])

20180110221027803625.jpg

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值