【pandas教程】数据透视表和堆叠

本文深入探讨了数据透视表的使用,包括如何通过`pd.pivot_table()`进行数据汇总、环比计算以及时间离散化处理。同时,介绍了堆叠操作,如`stack()`方法的不同用法,用于转换数据的行列结构。此外,还提到了堆叠的逆操作`unstack()`以及如何使用`pd.melt()`进行数据重塑。文章通过实例展示了这些操作在数据分析中的应用。
摘要由CSDN通过智能技术生成

数据透视表和堆叠操作

数据透视表

# 数据透视表(交叉表)三要素:索引、列名、值,此外可以传入聚合函数
pd.pivot_table(df, values='D', index=['A','B'], columns=['C'], aggfunc=np.sum)
# 使用pd.pivot_table()生成环比数据表,df.columns=['datetime','num','name']
pd.pivot_table(df.set_index(['datetime']).loc['20220201':'20220202'], values='num', index=['name'], columns=['datetime']).assign(ratio=lambda x: (x['20220202'] - x['20220201']) / x['20220201'])
# 使用pd.pivot_table()生成环比数据表,结合df.to_Period()进行数据离散化:W-周,M-月,Q-季度,Y-年
pd.pivot_table(df.set_index(['datetime']).loc['20220201':'20220215'].to_Period('W'), values='num', index=['name'], columns=['datetime'], aggfunc=np.sum).assign(ratio=lambda x: (x.to_period('w').loc[pd.to_datetime('2022-01-31/2022-02-06')] - x.to_period('w').loc[pd.to_datetime('2022-02-07/2022-02-13')] ) / x.to_period('w').loc[pd.to_datetime('2022-02-07/2022-02-13')] )

堆叠

# 堆叠stack,把列索引依次转换为内层行索引,默认的,将最内层列索引转换为最内层行索引,简单的说,将除了作为行索引以外的多个字段(多个列索引),堆叠为两列:一列为字段名,一列为对应值
stacked = df.stack()
# 堆叠stack,通过列索引名称选中一层索引,将其转换为最内层行索引
stacked = df.stack('exp') # exp是一层列索引的名称,不是列索引的名称
# 堆叠stack,通过列索引值选中一层列索引,将其转换为最内层行索引
stacked = df.stack(0) # 0代表最外层列索引
stacked = df.stack(-1) # -1代表最内层列索引
stacked = df.stack([0,1]) # 选中多层索引
# 堆叠逆操作,将行索引依次转换为内层列索引,默认的,将最内层行索引转换为最内层列索引,简单的说,将一个行索引放在列上,做成交叉表的形式
stacked.unstack()
# unstack与交叉表对比
df = pd.DataFrame(np.array([[1,2,3],[2,3,4]]), columns=['col1','col2','col3'])
## unstack生成交叉表
df1 = df.set_index(['col1','col2']).unstack()
df1.columns # unstack交叉表的列索引为多重索引
>>> MultiIndex([('col3', 2),
            ('col3', 3)],
           names=[None, 'col2'])
## pivot_table生成交叉表
df2 = pd.pivot_table(df,values='col3',columns=['col2'],index=['col1']) 
df2.columns # pivot_table交叉表的列索引为单层索引,仅指定列,交叉表的列名为指定列的值,交叉表列索引的name为指定列的列名
>>> Int64Index([2, 3], dtype='int64', name='col2')

# 堆叠逆操作,将次外层行索引转换为最内层列索引
stacked.unstack(1)
# 堆叠逆操作,将最外层行索引转换为最内层列索引
stacked.unstack(0)
# 堆叠操作,pd.melt指定不变的行,将剩下的列转换为两列[变量,值]
stacked = df.melt(id_vars=['first', 'last'],var_name='存放变量的列名', value_name='存放值的列名')

独热编码

# 生成独热编码pd.get_dummies(),仅能对一列数据进行独热编码,传入多列则返回原df
pd.get_dumies(df['key'])

列转行

# 展开值为list-like的列pd.explode(),list类型值会被展开,单个元素会保持原样,空list会返回Nan值
df['values'].explode()
df.explode('values')
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼摆摆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值