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

引入模块

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
Pandas是一个强大的数据处理和分析工具,它提供了丰富的数据结构和函数,可以方便地进行数据操作和分析。下面是Pandas的基础操作介绍: 1. 创建DataFrame:DataFrame是Pandas中最常用的数据结构,类似于Excel中的表格。可以通过传入字典、列表、数组等方式创建DataFrame。 2. 查看数据:可以使用head()方法查看DataFrame的前几行数据,默认显示前5行;使用tail()方法查看DataFrame的后几行数据,默认显示后5行。 3. 选择数据:可以使用方括号[]或者loc、iloc等方法选择DataFrame中的特定数据。方括号[]可以选择列,loc可以通过标签选择行和列,iloc可以通过索引选择行和列。 4. 过滤数据:可以使用布尔索引来过滤DataFrame中的数据。布尔索引是一个由True和False组成的数组,用于选择满足条件的行或列。 5. 添加和删除数据:可以使用assign()方法添加新的列到DataFrame中;使用drop()方法删除指定的行或列。 6. 数据排序:可以使用sort_values()方法对DataFrame中的数据进行排序,默认是按照升序排序。 7. 数据统计:可以使用describe()方法对DataFrame中的数值型数据进行统计描述,包括计数、均值、标准差、最小值最大值等。 8. 数据聚合:可以使用groupby()方法对DataFrame中的数据进行分组聚合操作,如求和平均值、计数等。 9. 数据合并:可以使用merge()方法将多个DataFrame按照指定的列进行合并,类似于SQL中的join操作。 10. 数据处理:Pandas提供了丰富的函数和方法用于数据处理,如填充缺失值、删除重复值、数据类型转换等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值