云南高端网站建设,网站站内内链建设,搜索网页内容,常州最新消息今天文章最前#xff1a; 我是Octopus#xff0c;这个名字来源于我的中文名--章鱼#xff1b;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github #xff1b;这博客是记录我学习的点点滴滴#xff0c;如果您对 Python、Java、AI、算法有兴趣#xff0c;可以关注我的… 文章最前 我是Octopus这个名字来源于我的中文名--章鱼我热爱编程、热爱算法、热爱开源。所有源码在我的个人github 这博客是记录我学习的点点滴滴如果您对 Python、Java、AI、算法有兴趣可以关注我的动态一起学习共同进步。 一.分组计算
#示例数据
df pd.read_csv(pokemon_data.csv,encodinggbk)
df.head(10)
姓名类型1类型2总计生命值攻击力防御力速度时代0BulbasaurGrassPoison3184549494511IvysaurGrassPoison4056062636012VenusaurGrassPoison5258082838013VenusaurMega VenusaurGrassPoison625801001238014CharmanderFireNaN3093952436515CharmeleonFireNaN4055864588016CharizardFireFlying53478847810017CharizardMega Charizard XFireDragon6347813011110018CharizardMega Charizard YFireFlying634781047810019SquirtleWaterNaN314444865431 1.如何分组计算
假设现在要根据“类型1”这列来做分组计算
#查看下类型1中的类别数量分布
df[类型1].value_counts()
Water 112
Normal 98
Grass 70
Bug 69
Psychic 57
Fire 52
Electric 44
Rock 44
Ground 32
Dragon 32
Ghost 32
Dark 31
Poison 28
Steel 27
Fighting 27
Ice 24
Fairy 17
Flying 4
Name: 类型1, dtype: int64
#查看类型1中有多少个类型
len(df[类型1].value_counts())
Q1想知道类型1的这18个种类各自的平均攻击力是多少单列分组计算
#根据类型1这列来分组并将结果存储在grouped1中
grouped1 df.groupby(类型1)
#输出grouped1这里就是显示它是一个分组对象并且存储的内存地址是0x0000000008EE9E80没什么卵用
grouped1
#求类型1的18个种类各自的平均攻击力
grouped1[[攻击力]].mean()
攻击力类型1Bug70.971014Dark88.387097Dragon112.125000Electric69.090909Fairy61.529412Fighting96.777778Fire84.769231Flying78.750000Ghost73.781250Grass73.214286Ground95.750000Ice72.750000Normal73.469388Poison74.678571Psychic71.456140Rock92.863636Steel92.703704Water74.151786
小结一下
grouped1 df.groupby(类型1)这一步就是分组计算流程里的第一步split
grouped1[[攻击力]].mean() 这一步就是分组计算流程的第二和第三步apply—combine
Q2想知道类型1和类型2的组合类型里每个组合各自的攻击力均值多列分组计算
grouped2 df.groupby([类型1,类型2])
grouped2[[攻击力]].mean()
想知道类型1和类型2的组合类型里每个组合各自的攻击力均值、中位数、总和对组应用多个函数
grouped2[[攻击力]].agg([np.mean,np.median,np.sum])
Q4想知道类型1和类型2的组合类型里每个组合各自的攻击力的均值和中位数生命值的总和对不同列应用不同的函数
grouped2.agg({攻击力:[np.mean,np.median],生命值:np.sum})
Q5对组内数据进行标准化处理转换
zscore lambda x : (x-x.mean())/x.std()
grouped1.transform(zscore)
Q6对组进行条件过滤
需求针对grouped2的这个分组希望得到平均攻击力为100以上的组其余的组过滤掉
attack_filter lambda x : x[攻击力].mean() 100
grouped2.filter(attack_filter)
Q7将类型1和2作为索引列按照索引来实现分组计算根据索引来分组计算
#将类型1、类型2设置为索引列
df_pokemon df.set_index([类型1,类型2])
#根据索引分组
grouped3 df_pokemon.groupby(level[类型1,类型2])
grouped3
#分组计算各列均值
grouped3.mean()
2.组的一些特征
查看每个索引组的个数
grouped2.size()
得到每个索引组的在源数据中的索引位置
grouped2.groups
得到包含索引组的所有数据
#得到索引组为Fire和Flying的所有数据
grouped2.get_group((Fire, Flying))
for name,group in grouped2:print(name)print(group.shape)
二.数据透视表
1.数据透视表pivot_table
#示例数据
df_p df.iloc[:10,0:6]
df_p
姓名类型1类型2总计生命值攻击力0BulbasaurGrassPoison31845491IvysaurGrassPoison40560622VenusaurGrassPoison52580823VenusaurMega VenusaurGrassPoison625801004CharmanderFireNaN30939525CharmeleonFireNaN40558646CharizardFireFlying53478847CharizardMega Charizard XFireDragon634781308CharizardMega Charizard YFireFlying634781049SquirtleWaterNaN3144448
#做一些修改
df_p.loc[0:2,姓名] A
df_p.loc[3:5,姓名] B
df_p.loc[6:9,姓名] C
df_p[类型2] df_p[类型2].fillna(Flying)
df_p.rename(columns{姓名:组},inplaceTrue)
#将组放在行上类型1放在列上计算字段为攻击力如果没有指定默认计算其均值
df_p.pivot_table(index组,columns类型1,values攻击力)
类型1FireGrassWater组ANaN64.333333NaNB58.0100.000000NaNC106.0NaN48.0
#将组放在行上类型1放在列上计算攻击力的均值和计数
df_p.pivot_table(index组,columns类型1,values攻击力,aggfunc[np.mean,len])
meanlen类型2DragonFlyingPoisonDragonFlyingPoison组类型1AGrassNaNNaN64.333333NaNNaN3.0BFireNaN58.0NaNNaN2.0NaNGrassNaNNaN100.000000NaNNaN1.0CFire130.094.0NaN1.02.0NaNWaterNaN48.0NaNNaN1.0NaN
#将组和类型1放在行上类型2放在列上计算生命值和攻击力的均值和计数
df_p.pivot_table(index[组,类型1],columns类型2,values[生命值,攻击力],aggfunc[np.mean,len])
meanlen攻击力生命值攻击力生命值类型2DragonFlyingPoisonDragonFlyingPoisonDragonFlyingPoisonDragonFlyingPoison组类型1AGrassNaNNaN64.333333NaNNaN61.666667NaNNaN3.0NaNNaN3.0BFireNaN58.0NaNNaN48.5NaNNaN2.0NaNNaN2.0NaNGrassNaNNaN100.000000NaNNaN80.000000NaNNaN1.0NaNNaN1.0CFire130.094.0NaN78.078.0NaN1.02.0NaN1.02.0NaNWaterNaN48.0NaNNaN44.0NaNNaN1.0NaNNaN1.0NaN
#将组和类型1放在行上类型2放在列上计算生命值和攻击力的均值和计数并且将缺失值填充为0
df_p1 df_p.pivot_table(index[组,类型1],columns类型2,values[生命值,攻击力],aggfunc[np.mean,len],fill_value0)
df_p1
meanlen攻击力生命值攻击力生命值类型2DragonFlyingPoisonDragonFlyingPoisonDragonFlyingPoisonDragonFlyingPoison组类型1AGrass0064.33333300.061.666667003003BFire0580.000000048.50.000000020020Grass00100.00000000.080.000000001001CFire130940.0000007878.00.000000120120Water0480.000000044.00.000000010010
#将组和类型1放在行上类型2放在列上计算生命值和攻击力的均值和计数将缺失值填充为0并且增加总计行列
df_p.pivot_table(index[组,类型1],columns类型2,values[生命值,攻击力],aggfunc[np.mean,len],fill_value0,marginsTrue)
2.重塑层次化索引
stack将数据最内层的列旋转到行上
unstack将数据最内层的行旋转到列上
#示例数据
df_p1
meanlen攻击力生命值攻击力生命值类型2DragonFlyingPoisonDragonFlyingPoisonDragonFlyingPoisonDragonFlyingPoison组类型1AGrass0064.33333300.061.666667003003BFire0580.000000048.50.000000020020Grass00100.00000000.080.000000001001CFire130940.0000007878.00.000000120120Water0480.000000044.00.000000010010
#将数据最内层的列旋转到行上也即是将类型2转移到行上
df_p1.stack()
meanlen攻击力生命值攻击力生命值组类型1类型2AGrassDragon0.0000000.00000000Flying0.0000000.00000000Poison64.33333361.66666733BFireDragon0.0000000.00000000Flying58.00000048.50000022Poison0.0000000.00000000GrassDragon0.0000000.00000000Flying0.0000000.00000000Poison100.00000080.00000011CFireDragon130.00000078.00000011Flying94.00000078.00000022Poison0.0000000.00000000WaterDragon0.0000000.00000000Flying48.00000044.00000011Poison0.0000000.00000000
#将数据最内层的行旋转到列上也即是将类型1转移到列上
df_p1.unstack()
mean...len攻击力生命值...攻击力生命值类型2DragonFlyingPoisonDragon...PoisonDragonFlyingPoison类型1FireGrassWaterFireGrassWaterFireGrassWaterFire...WaterFireGrassWaterFireGrassWaterFireGrassWater组ANaN0.0NaNNaN0.0NaNNaN64.333333NaNNaN...NaNNaN0.0NaNNaN0.0NaNNaN3.0NaNB0.00.0NaN58.00.0NaN0.0100.000000NaN0.0...NaN0.00.0NaN2.00.0NaN0.01.0NaNC130.0NaN0.094.0NaN48.00.0NaN0.078.0...0.01.0NaN0.02.0NaN1.00.0NaN0.0
三.交叉表
用于计算分组频率用的特殊透视表
#示例数据
df_p
组类型1类型2总计生命值攻击力0AGrassPoison31845491AGrassPoison40560622AGrassPoison52580823BGrassPoison625801004BFireFlying30939525BFireFlying40558646CFireFlying53478847CFireDragon634781308CFireFlying634781049CWaterFlying3144448
#计算组和类型1的交叉频率
pd.crosstab(indexdf_p[组],columnsdf_p[类型1])
类型1FireGrassWater组A030B210C301