Pandas教程(五)—— 重塑及数据透视

发布时间:2024年01月03日

1.数据重塑

重塑数据主要有两种方式,分别是 stack(堆叠)和 unstack(拆堆),他们两个是互逆的操作

函数作用参数

data.stack( )

堆叠

会“旋转”或将列中的数据透视到行

列 一一> 行

可以在括号里传入需要堆叠的轴向名称

data.unstack( )

拆堆

将行中的数据透视到列?

行 一一> 列

可以通过传入一个层级名称来拆分不同的层级

import pandas as pd
import numpy as np
data = pd.DataFrame(np.arange(12).reshape(6,2),
                    index = pd.MultiIndex.from_product([["Ohio","Colorado"],["one","two","three"]],names = ["state","number"]),
                    columns = pd.Index(["left","right"],name = "side"))
print(data)
print("-"*35)

# 拆堆 行透视为列
chai = data.unstack("state") # 传入要拆分的层级
print(chai)
print("-"*35)

# 堆叠 列透视为行
dui = chai.stack("side")
print(dui)

上述代码示意图

2.数据透视表

透视表是一种可以对数据动态排布并且分类汇总的表格格式

可以让我们从不同的角度去分析一个大数据库,有点类似于分类筛选的高阶版操作

?2.1 pivot_table?

? 该部分笔记参考了以下文章:

https://zhuanlan.zhihu.com/p/31952948icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/31952948

  • 语法:? ? ?

? ? ? ? ?pivot_table ( data,? index = None,? values = None,??columns = None,? aggfunc = 'mean' )??

常用参数说明:?

? ? ? ? ? ? ? ? ? ?index:? 设置行分层字段,将选中的列设为行索引? ?👇

? ? ? ? ? ? ? ? ? ?values:输入一个含列名的列表,筛选我们需要保留的列

? ? ? ? ? ? ? ? ? ?columns:类似Index设置列分层字段,将选中的列设为列索引? ?👉

? ? ? ? ? ? ? ? ? ?aggfunc:设置我们对数据聚合时进行的函数操作,默认为 mean

? ? ? ? ? ? ? ? ? ?fill_value:替换缺失值

? ? ? ? ? ? ? ? ? ?drop_na:是否去除所有条目均为NA的列(默认False,不去除)

? ? ? ? ? ? ? ? ? ?margins:是否添加行 / 列计数 及 总计数(默认False,不添加)

  • 参数使用说明

? ? ? ?下面我们以詹姆斯某赛季的数据为例,来对pivot_table函数进行讲解

? step1? 首先导入数据,并展示前五场:

import pandas as pd
import numpy as np
road = "E:\python 资料\孙兴华 数据分析教程\Pandas课件\课件\pandas教程\课件028-029\Lebron_James.csv"
data = pd.read_table(road,sep=",")
print(data.head(5))
詹姆斯比赛数据,前五场

?step2??需要james在主客场和不同胜负情况(index下的得分、篮板与助攻(values三项数据

data1 = pd.pivot_table(data, index=['对手', '主客场'],values=['得分','助攻','篮板'])
print(data1.head(5))
上述代码筛选得到的数据

? ?step3??我们还想获得james在主客场和不同胜负情况下的得分、篮板、助攻(aggfunc

? ? ? ? ? ? ? 此时应该向aggfunc中输入sum函数,按层次求和

# 这里要注意mean不是内置函数,它是numpy中的一个函数
data2 = pd.pivot_table(data, index=['对手', '主客场'],values=['得分','助攻','篮板'],
                       aggfunc=[sum,np.mean])
print(data2.head(5))
总得分、篮板、助攻情况如图

??step4??我们也可以通过columns再设置一个列索引,并且通过margin来汇总

# fill_value填充空值,margins=True进行汇总
data3 =pd.pivot_table(data,index=['主客场'],columns=['对手'],values=['得分'],aggfunc=[np.sum],fill_value=0,margins=1)
print(data3)
行索引为主客场,列索引为对手球队

?2.2?实现excel的vlookup功能

  • 要求:一个excel表中有两个sheet,要求将 sheet1 中的某列,插入到 sheet2 的指定位置?

  • step:
  1. ?切片要合并的列?
  2. 将它和sheet2合并
  3. 再在合并的数据中提取出该列,并在合并数据中删除该列
  4. 将提取出的该列插入指定位置
import pandas as pd
road = "E:\python 资料\孙兴华 数据分析教程\Pandas课件\课件\pandas教程\课件028-029\Vlookup.xlsx"
data1 = pd.read_excel(road,sheet_name="花名册")
data2 = pd.read_excel(road,sheet_name="成绩单")

# 将 花名册 与 成绩单中的总分、学号 合并
hebing = pd.merge(data1,data2.loc[:,["学号","总分"]],how = "left",on = "学号")
print(hebing)
print("-" * 40)

# 将总分放到第二列的位置
score = hebing.总分 # 提取出 总分 列
hebing = hebing.drop("总分",axis = 1) # 在原数据中删除该列
hebing.insert(1,"总分",score) # 在原数据第二列插入新列
print(hebing)

文章来源:https://blog.csdn.net/m0_61766362/article/details/135329941
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。