Python数据分析第二篇--数据计算
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()
2.单个求平均
grouped1[‘HP‘].mean()
3.求和
grouped1.sum()
4.求中位数
grouped1.median()
分组:方法二:多个
grouped2 = pokemon.groupby([‘Type 1‘, ‘Type 2‘])
计算中,应用多个函数
grouped2.aggregate(np.mean)
grouped2.aggregate([np.mean,np.median])
针对不同的列:
grouped2.aggregate([np.mean,np.median,np.sum])[‘HP‘]
不同的列:用不同函数
grouped2.agg({‘HP‘:np.mean,‘Attack‘:np.median}) grouped2.agg({‘HP‘:np.mean,‘Attack‘:[np.median,np.sum]})
查看大小:
grouped2.size()
查看具体分组:
grouped2.groups
获得某一组:
grouped2.get_group((‘Normal‘, ‘Ground‘)) #填写元组
计算每个组大小:
for name,group in grouped2: print(name) print(group.shape)
对数据进行标准化:(防止数值过大)
数值型: 该列,每一个减去平均数 除以 该列标准差
zscore = lambda s : ( s - s.mean() ) / s.std() grouped1.transform(zscore)
过滤:
某些组别样本数过大!,需要剔除
# 假设要求每个组别样本小于10 cond1 = lambda s : len(s)<10 grouped2.filter(cond1).shape
前情:设置索引:
pok1 = pokemon.set_index([‘Type 1‘, ‘Type 2‘])
按索引进行分组:
pok1.groupby(level=[0]) pok1.groupby(level=[0,1]) pok1.groupby(level=[‘Type 1‘, ‘Type 2‘])
多表操作:
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])
数据表操作:组合
pd.concat([df1,df2])
pd.concat([df1,df2],axis=1) # axis =1 设置轴根据索引组合 =0按列名
类似方法
df1.append(df2) # append只能填一个参数!
主角,主键讲解:
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‘], })
# how 组合方式 默认inner outer = 相等连接 # on = 左右两边 用什么key连接 # 根据key1 设置join组合 pd.merge(left,right,on=‘key1‘,how=‘inner‘)
pd.merge(left,right,on=[‘key1‘,‘key2‘])
pd.merge(left,right,on=[‘key1‘,‘key2‘],how=‘left‘)
重命名:
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‘)
索引位与列的组合:
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‘)
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())
行变列显示:
a = grouped3[‘amountOfTrans‘].sum() a.unstack() # stack() 与unstack() 逆操作!! # a.stack() a.unstack()
rename:
a.rename(columns = {a.columns[0]:‘shouru‘,a.columns[1]:‘zhichu‘},inplace=True)
直接运算:
a[‘diff‘] = a[‘shouru‘] - a[‘zhichu‘]
透视表:
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 显示总频率
dummy variables
没有意义的类别,不需要比较的数据
#在Type1的类别中,有且唯有一个 1 pd.get_dummies(data=pokemon,columns=[‘Type 1‘]) pd.get_dummies(data=pokemon,columns=[‘Type 1‘,‘Type 2‘])
以上是关于Python数据分析第二篇--数据计算的主要内容,如果未能解决你的问题,请参考以下文章