DataFrame—数据汇总4

文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。

一.分组计算 

#示例数据
df = pd.read_csv("pokemon_data.csv",encoding="gbk")
df.head(10)
姓名类型1类型2总计生命值攻击力防御力速度时代
0BulbasaurGrassPoison318454949451
1IvysaurGrassPoison405606263601
2VenusaurGrassPoison525808283801
3VenusaurMega VenusaurGrassPoison62580100123801
4CharmanderFireNaN309395243651
5CharmeleonFireNaN405586458801
6CharizardFireFlying5347884781001
7CharizardMega Charizard XFireDragon634781301111001
8CharizardMega Charizard YFireFlying63478104781001
9SquirtleWaterNaN314444865431

 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()
攻击力
类型1
Bug70.971014
Dark88.387097
Dragon112.125000
Electric69.090909
Fairy61.529412
Fighting96.777778
Fire84.769231
Flying78.750000
Ghost73.781250
Grass73.214286
Ground95.750000
Ice72.750000
Normal73.469388
Poison74.678571
Psychic71.456140
Rock92.863636
Steel92.703704
Water74.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总计生命值攻击力
0BulbasaurGrassPoison3184549
1IvysaurGrassPoison4056062
2VenusaurGrassPoison5258082
3VenusaurMega VenusaurGrassPoison62580100
4CharmanderFireNaN3093952
5CharmeleonFireNaN4055864
6CharizardFireFlying5347884
7CharizardMega Charizard XFireDragon63478130
8CharizardMega Charizard YFireFlying63478104
9SquirtleWaterNaN3144448
#做一些修改
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={"姓名":"组"},inplace=True)
#将组放在行上,类型1放在列上,计算字段为攻击力,如果没有指定,默认计算其均值
df_p.pivot_table(index="组",columns="类型1",values="攻击力")
类型1FireGrassWater
ANaN64.333333NaN
B58.0100.000000NaN
C106.0NaN48.0
#将组放在行上,类型1放在列上,计算攻击力的均值和计数
df_p.pivot_table(index="组",columns="类型1",values="攻击力",aggfunc=[np.mean,len])
meanlen
类型2DragonFlyingPoisonDragonFlyingPoison
类型1
AGrassNaNNaN64.333333NaNNaN3.0
BFireNaN58.0NaNNaN2.0NaN
GrassNaNNaN100.000000NaNNaN1.0
CFire130.094.0NaN1.02.0NaN
WaterNaN48.0NaNNaN1.0NaN
#将组和类型1放在行上,类型2放在列上,计算生命值和攻击力的均值和计数
df_p.pivot_table(index=["组","类型1"],columns="类型2",values=["生命值","攻击力"],aggfunc=[np.mean,len])
meanlen
攻击力生命值攻击力生命值
类型2DragonFlyingPoisonDragonFlyingPoisonDragonFlyingPoisonDragonFlyingPoison
类型1
AGrassNaNNaN64.333333NaNNaN61.666667NaNNaN3.0NaNNaN3.0
BFireNaN58.0NaNNaN48.5NaNNaN2.0NaNNaN2.0NaN
GrassNaNNaN100.000000NaNNaN80.000000NaNNaN1.0NaNNaN1.0
CFire130.094.0NaN78.078.0NaN1.02.0NaN1.02.0NaN
WaterNaN48.0NaNNaN44.0NaNNaN1.0NaNNaN1.0NaN
#将组和类型1放在行上,类型2放在列上,计算生命值和攻击力的均值和计数,并且将缺失值填充为0
df_p1 = df_p.pivot_table(index=["组","类型1"],columns="类型2",values=["生命值","攻击力"],aggfunc=[np.mean,len],fill_value=0)
df_p1
meanlen
攻击力生命值攻击力生命值
类型2DragonFlyingPoisonDragonFlyingPoisonDragonFlyingPoisonDragonFlyingPoison
类型1
AGrass0064.33333300.061.666667003003
BFire0580.000000048.50.000000020020
Grass00100.00000000.080.000000001001
CFire130940.0000007878.00.000000120120
Water0480.000000044.00.000000010010
#将组和类型1放在行上,类型2放在列上,计算生命值和攻击力的均值和计数,将缺失值填充为0,并且增加总计行列
df_p.pivot_table(index=["组","类型1"],columns="类型2",values=["生命值","攻击力"],aggfunc=[np.mean,len],fill_value=0,margins=True)

2.重塑层次化索引

stack():将数据最内层的列旋转到行上

unstack():将数据最内层的行旋转到列上

#示例数据
df_p1
meanlen
攻击力生命值攻击力生命值
类型2DragonFlyingPoisonDragonFlyingPoisonDragonFlyingPoisonDragonFlyingPoison
类型1
AGrass0064.33333300.061.666667003003
BFire0580.000000048.50.000000020020
Grass00100.00000000.080.000000001001
CFire130940.0000007878.00.000000120120
Water0480.000000044.00.000000010010
#将数据最内层的列旋转到行上,也即是将类型2转移到行上
df_p1.stack()
meanlen
攻击力生命值攻击力生命值
类型1类型2
AGrassDragon0.0000000.00000000
Flying0.0000000.00000000
Poison64.33333361.66666733
BFireDragon0.0000000.00000000
Flying58.00000048.50000022
Poison0.0000000.00000000
GrassDragon0.0000000.00000000
Flying0.0000000.00000000
Poison100.00000080.00000011
CFireDragon130.00000078.00000011
Flying94.00000078.00000022
Poison0.0000000.00000000
WaterDragon0.0000000.00000000
Flying48.00000044.00000011
Poison0.0000000.00000000
#将数据最内层的行旋转到列上,也即是将类型1转移到列上
df_p1.unstack()
mean...len
攻击力生命值...攻击力生命值
类型2DragonFlyingPoisonDragon...PoisonDragonFlyingPoison
类型1FireGrassWaterFireGrassWaterFireGrassWaterFire...WaterFireGrassWaterFireGrassWaterFireGrassWater
ANaN0.0NaNNaN0.0NaNNaN64.333333NaNNaN...NaNNaN0.0NaNNaN0.0NaNNaN3.0NaN
B0.00.0NaN58.00.0NaN0.0100.000000NaN0.0...NaN0.00.0NaN2.00.0NaN0.01.0NaN
C130.0NaN0.094.0NaN48.00.0NaN0.078.0...0.01.0NaN0.02.0NaN1.00.0NaN0.0

三.交叉表

用于计算分组频率用的特殊透视表

#示例数据
df_p
类型1类型2总计生命值攻击力
0AGrassPoison3184549
1AGrassPoison4056062
2AGrassPoison5258082
3BGrassPoison62580100
4BFireFlying3093952
5BFireFlying4055864
6CFireFlying5347884
7CFireDragon63478130
8CFireFlying63478104
9CWaterFlying3144448
#计算组和类型1的交叉频率
pd.crosstab(index=df_p["组"],columns=df_p["类型1"])
类型1FireGrassWater
A030
B210
C301
  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值