61651566

整理数据

学习目标

  • 掌握melt函数整理数据的方法
  • 掌握stack、unstack的用法
  • 掌握wide_to_long函数的用法

1 melt整理数据

1.1 宽数据集变为长数据集

  • 加载美国收入与宗教信仰数据
import pandas as pd
pew = pd.read_csv('data/pew.csv')
pew
# 输出结果如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CHryjogG-1630976159977)(./img/整理数据-01.png)]

  • 先执行下面的代码,将输出的结果和上面的输出结果进行对比
pew_long = pd.melt(pew, id_vars='religion')
print(pew_long)
# 输出结果如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ARsITyhm-1630976159978)(./img/整理数据-02.png)]

  • 我们发现,基于religion列,把原来的df拉长了,我们称原来的df为**宽数据集,拉长之后的df称之为长数据集**
    • 对于展示数据而言,下图中pwe返回的这种"宽"数据没有任何问题,如第一行数据,展示了Agnostic(不可知论(者))所有的收入分布情况
    • 从数据分析的角度,有时候我们需要把数据由"宽"数据,转换成”长”数据,就如同下图中pew_long返回的数据
    • 在pandas中我们就可以使用df.melt()函数,通过各种参数,来达成宽数据集转换为长数据集的效果
pew # 单独运行
pew_long.sort_values('religion').head(20) # 单独运行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MxqmS2XA-1630976159979)(./img/整理数据-03.png)]

1.2 melt函数的参数

  • melt 是溶解/分解的意思, 即拆分数据;melt即是类函数也是实例函数,也就是说既可以用pd.melt(), 也可使用dataframe.melt()
参数类型说明
framedataframe必要参数,被 melt 的数据集名称在 pd.melt() 中使用,比如上例中pd.melt(pew, id_vars='religion')pew
id_varstuple/list/ndarray可选项,不需要被转换的列名,在转换后作为标识符列(不是索引列),比如上例pd.melt(pew, id_vars='religion')
value_varstuple/list/ndarray可选项,需要被转换的现有列,如果未指明value_vars,除id_vars指定的其他列都将被转换
var_namestring自定义设置variable列的列名
value_namestring自定义设置value列的列名
  • 比如,可以更改melt之后的数据的列名
pew_long = pd.melt(pew, id_vars='religion', var_name='income', value_name='count')
pew_long.head()
# 输出结果如下
	religion	income	count
0	Agnostic	<$10k	27
1	Atheist		<$10k	12
2	Buddhist	<$10k	27
3	Catholic	<$10k	418
4	Don’t know/refused	<$10k	15

1.3 练习

1.3.1 加载并观察数据集
  • 加载数据
bill_board = pd.read_csv('data/billboard.csv')
bill_board.head()
# 输出结果如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XT5CSaRY-1630976159981)(./img/长宽数据集练习-01.png)]

  • 经观察思考,最终结果如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GKtdIaym-1630976159982)(./img/长宽数据集练习-02.png)]

1.3.2 变换为长数据集
  • 在使用melt函数转换数据的时候,也可以固定多数列,只转换少数列;对上面数据的周评分进行处理,转换成长数据
bill_borad_long = pd.melt(
    bill_board,
    id_vars=['year','artist','track','time','date.entered'],
    var_name='week',
    value_name='rating'
)
bill_borad_long
# 输出结果如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wou4p5zH-1630976159983)(./img/长宽数据集练习-03.png)]

2 stack整理数据

  • pandas进行数据重排时,经常用到stack和unstack两个函数。stack的意思是堆叠、堆积,unstack即“不要堆叠”
  • 常见的数据的层次化结构有两种,一种是表格,一种是“花括号”,即下面这样的l两种形式:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wNJ0lgs7-1630976159984)(./img/stack函数-1.png)]

  • stack函数会将数据从”表格结构“变成”花括号结构“(返回的是series类型),即将其行索引变成列索引,反之,unstack函数将数据从”花括号结构“变成”表格结构“,即要将其中一层的列索引变成行索引

接下来我们就来感受一下stack函数的使用,本节无需理会数据集本身的业务

  • 加载state_fruit数据集
state_fruit = pd.read_csv('data/state_fruit.csv', index_col=0)
state_fruit
# 返回结果如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qRuSYIOv-1630976159985)(./img/stack函数-2.png)]

  • 使用df.stack()函数,查看返回结果
state_fruit_series = state_fruit.stack()
print(state_fruit_series)
print(type(state_fruit_series))
# 输出结果如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KAA2Z0eW-1630976159986)(./img/stack函数-3.png)]

  • 此时可以使用reset_index(),将结果变为DataFrame
state_fruit_tidy = state_fruit.stack().reset_index()
state_fruit_tidy
# 输出结果如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b3n7DXWg-1630976159987)(./img/stack函数-4.png)]

  • 给列重新命名
state_fruit_tidy.columns = ['state', 'fruit', 'weight']
state_fruit_tidy
# 输出结果如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IBurdz8W-1630976159987)(./img/stack函数-5.png)]

  • 也可以使用rename_axis给不同的行索引层级命名
state_fruit.stack().rename_axis(['state', 'fruit'])
# 输出结果如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tz43OKKo-1630976159988)(./img/stack函数-6.png)]

  • 再次使用reset_index方法
# 此时发现最后一列因为没有指定,所以列名为0
state_fruit.stack().rename_axis(['state', 'fruit']).reset_index() # 单独执行
# reset_index方法传入name参数,指定缺少的列名
state_fruit.stack().rename_axis(['state', 'fruit']).reset_index(name='weight') # 单独执行
# 输出结果如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vgvm9IxS-1630976159989)(./img/stack函数-7.png)]

  • unstack函数
state_fruit_series.unstack()
# 输出结果如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MipG2PK0-1630976159990)(./img/stack函数-2.png)]

3 wide_to_long整理数据

我们通过一个数据整理的具体需求来学习 wide_to_long 函数,需求:

  • 加载data/movie.csv数据,统计每部电影的每个主演的被点赞数,返回新的df
  • 新df的列名为 movie_titleactor_numactoractor_facebook_likes;分别代表电影名称、演员编号、演员姓名、该演员被点赞数

3.1 初步整理数据

  • 加载数据
movie = pd.read_csv('data/movie.csv')
movie.head()
# 输出结果如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m0yMkUAx-1630976159990)(./img/wide2long-1.png)]

  • 去除无关字段
actor = movie[[
    'movie_title', 'actor_1_name', 'actor_2_name', 'actor_3_name', 
    'actor_1_facebook_likes', 'actor_2_facebook_likes', 'actor_3_facebook_likes'
]]
actor.head()
# 输出结果如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WcEJufOW-1630976159991)(./img/wide2long-2.png)]

  • 整理列名
actor2 = actor.copy()
actor2.columns = [
    'movie_title', 'actor_1', 'actor_2', 'actor_3', 
    'actor_facebook_likes_1', 'actor_facebook_likes_2', 'actor_facebook_likes_3'
]
actor2.head()
# 输出结果如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LYPQrG1O-1630976159992)(./img/wide2long-3.png)]

3.2 wide_to_long函数的具体使用

  • 先执行下面的代码,观看输出结果
stubs = ['actor', 'actor_facebook_likes']
actor2_tidy = pd.wide_to_long(
    actor2, 
    stubnames=stubs, 
    i=['movie_title'], 
    j='actor_num', 
    sep='_'
).reset_index()
actor2_tidy.head()
# 输出结果如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IfMEeUU6-1630976159992)(./img/wide2long-4.png)]

  • 查看名为Avatar的电影的演员信息
actor2_tidy[actor2_tidy['movie_title']=='Avatar']
# 输出结果如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i2mNLCZq-1630976159993)(./img/wide2long-5.png)]

  • wide_to_long函数的作用是将列名起始部分相同的列进行拆解,使宽数据变换为长数据
new_df = pd.wide_to_long(
	actor2, # dataframe
    stubnames=['actor', 'actor_facebook_likes'],  # 要处理的列名开头,提取以指定字符串开头的列,可以是多个
    i=['movie_title'],  # 用作索引的列名
    j='actor_num',  # 提取列名开头后剩余的部分会成一列,在此指定列名
    sep='_' # 指定列名中的分隔符
)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0iU7KM5y-1630976159993)(./img/wide2long-6.png)]

小结

  • melt,stack,wide_to_long函数均可以实现讲宽数据整理成长数据
    • melt:指定数据列,将指定列变成长数据
    • stack:返回一个具有多层级索引的数据,配合reset_index可以实现宽数据变成长数据
    • wide_to_long:处理列名带数字后缀的宽数据
  • stack/unstack, melt/pivot_table 互为逆向操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值