04 -1 pandas索引的堆(行列操作,交换行列)、聚合操作(求和、最大值、最小值、平均值等)

本文深入探讨了Pandas库中的数据重塑方法,包括stack()与unstack()函数的灵活应用,以及如何通过聚合操作进行数据分析。通过实例展示了如何改变DataFrame的行和列结构,以及如何计算平均值、最大值等统计指标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引入模块

import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt

创建示例DataFrame

# 用作案例 不要删 !!!
data=np.random.randint(0,150,size=(2,8))
index=["rose","jack"]
columns=pd.MultiIndex.from_product([["期中","期末"],["一模","二模"],["语文","英语"]])
df = DataFrame(data,index=index,columns=columns)
df
期中期末
一模二模一模二模
语文英语语文英语语文英语语文英语
rose87113911351261365741
jack71251351194414512763

1. 索引的堆(stack)

  • stack()
  • unstack()

stack() columns -> index 列标题变行标题(数据也会跟着标题走)

df.stack() # 把列的标题 放到行上
df
期中期末
一模二模一模二模
rose英语11313513641
语文879112657
jack英语12511914563
语文713544127
df.stack().stack()
期中期末
rose英语一模113136
二模13541
语文一模87126
二模9157
jack英语一模125145
二模11963
语文一模7
二模135127
df.stack().stack().stack()
结果为:
rose  英语  一模  期中    113
              期末    136
          二模  期中    135
              期末     41
      语文  一模  期中     87
              期末    126
          二模  期中     91
              期末     57
jack  英语  一模  期中    125
              期末    145
          二模  期中    119
              期末     63
      语文  一模  期中      7
              期末     44
          二模  期中    135
              期末    127
dtype: int32
type(df.stack().stack().stack())
结果为:
pandas.core.series.Series

对于单级列索引,列索引没了,直接变Series

对于多级列索引,通过level指明要转换的columns

level 的值默认为-1(最内层);取值从外往里 从0递增

df.stack(level=0) # level 索引的级别 默认是-1 -1就是最里面的  level的值 从外到内 0 1 2 3
一模二模
英语语文英语语文
rose期中1138713591
期末1361264157
jack期中1257119135
期末1454463127
df.stack(level=1)
期中期末
英语语文英语语文
rose一模11387136126
二模135914157
jack一模125714544
二模11913563127

【小技巧】使用stack()时,level等于哪个columns,哪个columns就消失,变成index(行标题)

unstack() index -> columns 行标题变列标题(数据也会跟着标题走)

df.unstack()
结果为:
期中  一模  语文  rose     87
            jack      7
        英语  rose    113
            jack    125
    二模  语文  rose     91
            jack    135
        英语  rose    135
            jack    119
期末  一模  语文  rose    126
            jack     44
        英语  rose    136
            jack    145
    二模  语文  rose     57
            jack    127
        英语  rose     41
            jack     63
dtype: int32
df1 = df.stack().stack()
df1
期中期末
rose英语一模113136
二模13541
语文一模87126
二模9157
jack英语一模125145
二模11963
语文一模744
二模13512
df1.unstack(level=2)
期中期末
一模二模一模二模
rose英语11313513641
语文879112657
jack英语12511914563
语文713544127
df1.unstack(level=-1)
与level=2 结果保持一致

练习:行列互换

df.stack().stack().stack().unstack(level=0)
rosejack
英语一模期中113125
1期末136145
二模二模期中135119
期末4163
语文一模期中877
期末12644
二模期中91135
期末57127

【小技巧】使用unstack()时,level等于哪个index,哪个index就消失,变成columns(列标题)

============================================

练习:

  1. 将df变为两行,分别为期中期末
  2. 将df的行和列换位置(标题层级关系不能变)

============================================

df.stack(level=0).unstack(level=0)
一模二模
英语语文英语语文
rosejackrosejackrosejackrosejack
期中11312587713511991135
期末13614512644416357127
df.stack(level=0).unstack(level=0).stack(level=0).stack(level=0)
jackrose
期中一模英语125113
语文787
二模英语119135
语文13591
期末一模英语145136
语文44126
二模英语6341
语文12757

2. 聚合操作

【注意】

  • 需要指定axis
  • 【小技巧】和unstack()相反,聚合的时候,axis等于哪一个,哪一个就保留。

所谓的聚合操作:最大值,最小值,平均数……

回忆一下ndarray的聚合

sum nansum、min、max、mean、argmin、argmax

data = np.random.randint(0,5,size=(5,5))
columns = list('ABCDE')
df = DataFrame(data=data,columns=columns)
df
ABCDE
044124
141430
222242
342244
411014
df.sum() # 默认是对 列进行聚合
结果为:
A    15
B    10
C     9
D    14
E    14
dtype: int64

如果想对 行进行聚合操作 可以调整 axis,axis 默认值是0 是对列做加和

df.sum(axis=1)
结果为:
0    15
1    12
2    12
3    16
4     7
dtype: int64
df.max() 
结果为:
A    4
B    4
C    4
D    4
E    4
dtype: int32
df.min()
结果为:
A    1
B    1
C    0
D    1
E    0
dtype: int32
df.mean()
结果为:
A    3.0
B    2.0
C    1.8
D    2.8
E    2.8
dtype: float64

这些聚合操作都可以通过设置axis来切换方向

============================================

练习11:

  1. 计算期中期末各个科目平均成绩
  2. 计算各科目张三李四的最高分

============================================

index = ['张三','李四']
columns = pd.MultiIndex.from_product([['期中','期末'],['python','php','java']])
data = np.random.randint(0,150,size=(2,6))
score = DataFrame(data=data,index=index,columns=columns)
score
期中期末
pythonphpjavapythonphpjava
张三1314714712983144
李四131148407973
score.mean()
结果为:
期中  python     72.0
    php       147.5
    java       93.5
期末  python     68.0
    php        90.0
    java       73.5
dtype: float64
score.max()#求每门的平均值
结果为:
期中  python    131
    php       148
    java      147
期末  python    129
    php        97
    java      144
dtype: int32

score.max(axis=1)#求每个人的总科目平均值
结果为:
张三    147
李四    148
dtype: int32
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值