江流儿

V1

2023/01/29阅读:33主题:默认主题

数据透视与合并

数据透视与合并

一、数据透视

数据透视 可以算是利用 Pandas 进行数据分析最核心的操作,在 pandas 中可以通过 pivot_table 实现, 如果你能熟练使用 Pandas 进行数据透视,将会极大提高工作销效率,因为:

  • 更快的速度,并且可以自动化
  • 更易理解(看代码你就知道它做了什么)
  • 易于使用以生成报告或电子邮件
  • 更灵活,因为您可以定义自定义聚合函数

数据透视与合并将涉及四大函数:

  • pivot_table
  • concat
  • merge
  • join

数据透视表

本页数据说明

1、加载数据

读取当前目录下 "某超市销售数据.csv" 并设置千分位符号为 ,

import pandas as pd
df = pd.read_csv('某超市销售数据.csv',thousands=',')
df.head()

2、数据透视|默认

制作各省「平均销售额」的数据透视表

pd.pivot_table(df,values = ['销售额'],index = '省/自治区')

3、数据透视|指定方法

制作各省「销售总额」的数据透视表

pd.pivot_table(df,values = ['销售额'],index = '省/自治区',aggfunc = sum)

4、数据透视|多方法

制作各省「销售总额」与「平均销售额」的数据透视表

pd.pivot_table(df,values=['销售额'],index='省/自治区',aggfunc=[sum,'mean'])

5、数据透视|多指标

制作各省市「销售总额」与「利润总额」的数据透视表

pd.pivot_table(df,values=['销售额','利润','数量'],index='类别',aggfunc=sum)

6、数据透视|多索引

制作「各省市」与「不同类别」产品「销售总额」的数据透视表

pd.pivot_table(df,values='销售额',index=['省/自治区','类别'],aggfunc=sum)

7、数据透视|多层

制作各省市「不同类别」产品的「销售总额」透视表

pd.pivot_table(df,values='销售额',index='省/自治区',columns='类别',aggfunc=sum)

8、数据透视|综合

制作「各省市」、「不同类别」产品「销售量与销售额」的「均值与总和」的数据透视表,并在最后追加一行『合计』

pd.pivot_table(df,values=['销售额','数量'],index=['省/自治区','类别'],aggfunc=[sum,'mean'],margins=True)

9、数据透视|筛选

查询 「类别」 等于 「办公用品」 的详情

table = pd.pivot_table(df,values = ['销售额','数量'],index = ['省/自治区','类别'],aggfunc = ['mean',sum],margins=True)
table.query('类别==["办公用品"]')

10、数据透视|逆透视

透视就是将宽的表转换为长的表,例如5中的透视表进行逆透视,其中不需要转换的列为『数量』列

table = pd.pivot_table(df,values = ['销售额','利润','数量'],index = '类别',aggfunc = sum)
table.melt(id_vars=['数量'],var_name='分类',value_name='金额')

二、数据合并

concat - 数据拼接 concat主要用于数据拼接,也是非常常用的一个操作。

f1 = pd.DataFrame({'A': ['A0''A1''A2''A3'],
                    'B': ['B0''B1''B2''B3'],
                    'C': ['C0''C1''C2''C3'],
                    'D': ['D0''D1''D2''D3']},
                   index=[0123])


df2 = pd.DataFrame({'A': ['A4''A5''A6''A7'],
                    'B': ['B4''B5''B6''B7'],
                    'C': ['C4''C5''C6''C7'],
                    'D': ['D4''D5''D6''D7']},
                   index=[4567])


df3 = pd.DataFrame({'A': ['A8''A9''A10''A11'],
                    'B': ['B8''B9''B10''B11'],
                    'C': ['C8''C9''C10''C11'],
                    'D': ['D8''D9''D10''D11']},
                   index=[891011])


df4 = pd.DataFrame({'B': ['B2''B3''B6''B7'],
                    'D': ['D2''D3''D6''D7'],
                    'F': ['F2''F3''F6''F7']},
                   index=[2367])

1、concat|默认拼接

拼接 df1 和 df2

pd.concat([df1, df2])

2、concat|拼接多个

垂直拼接 df1、df2、df3,效果如下图所示

pd.concat([df1, df2, df3])

3、concat|重置索引

垂直拼接 df1 和 df4,并按顺序重新生成索引

pd.concat([df1, df4], ignore_index=True)

4、concat|横向拼接

横向拼接 df1、df4,效果如下图所示

pd.concat([df1,df4],axis=1)

5、concat|横向拼接(取交集)

pd.concat([df1,df4],axis=1,join='inner')

6、concat|横向拼接(取指定)

pd.concat([df1, df4], axis=1).reindex(df1.index)

7、concat|新增索引

拼接 df1、df2、df3,同时新增一个索引(x、y、z)来区分不同的表数据来源

pd.concat([df1, df2, df3], keys=['x''y''z'])

merge - 数据连接 concat是拼接,merge则是连接,同样重要的一个操作

8、merge|按单键

根据 key 连接 left 和 right

left = pd.DataFrame({'key': ['K0''K1''K2''K3'],
                     'A': ['A0''A1''A2''A3'],
                     'B': ['B0''B1''B2''B3']})

right = pd.DataFrame({'key': ['K0''K1''K2''K3'],
                      'C': ['C0''C1''C2''C3'],
                      'D': ['D0''D1''D2''D3']})
pd.merge(left, right, on='key')

9、merge|按多键

根据 key1 和 key2 连接 left 和 right

left = pd.DataFrame({'key1': ['K0''K0''K1''K2'],
                     'key2': ['K0''K1''K0''K1'],
                     'A': ['A0''A1''A2''A3'],
                     'B': ['B0''B1''B2''B3']})


right = pd.DataFrame({'key1': ['K0''K1''K1''K2'],
                      'key2': ['K0''K0''K0''K0'],
                      'C': ['C0''C1''C2''C3'],
                      'D': ['D0''D1''D2''D3']})
pd.merge(left, right, on=['key1''key2'])

10、merge|左外连接

如下图所示的结果连接 left 和 right,保留左表全部键

pd.merge(left, right, how='left', on=['key1''key2'])

11、merge|右外连接

如下图所示的结果连接 left 和 right,保留右表全部键

pd.merge(left, right, how='right', on=['key1''key2'])

12、merge|全外连接

如下图所示的结果连接 left 和 right,保留全部键

pd.merge(left, right, how='outer', on=['key1''key2'])

13、merge|内连接

如下图所示的结果连接 left 和 right,保留交集

pd.merge(left, right, how='inner', on=['key1''key2'])

14、merge|重复索引

重新产生数据并按下图所示进行连接

left = pd.DataFrame({'k': ['K0''K1''K2'], 'v': [123]})

right = pd.DataFrame({'k': ['K0''K0''K3'], 'v': [456]})
pd.merge(left, right, on='k', suffixes=['_l''_r'])

join - 组合 最后一个数据合并的常用且重要的操作是join

left = pd.DataFrame({'A': ['A0''A1''A2'],
                     'B': ['B0''B1''B2']},
                     index=['K0''K1''K2'])


right = pd.DataFrame({'C': ['C0''C2''C3'],
                      'D': ['D0''D2''D3']},
                      index=['K0''K2''K3'])

15、join|左对齐

合并 left 和 right,并按照 left 的索引进行对齐

left.join(right)

16、join|左对齐(外连接)

按下图所示进行连接

left.join(right, how='outer')

17、join|左对齐(内连接)

按下图所示进行连接

left.join(right, how='inner')

18、join|按索引

重新产生数据并按下图所示进行连接(根据 key)

left = pd.DataFrame({'A': ['A0''A1''A2''A3'],
                     'B': ['B0''B1''B2''B3'],
                     'key': ['K0''K1''K0''K1']})


right = pd.DataFrame({'C': ['C0''C1'],
                      'D': ['D0''D1']},
                      index=['K0''K1'])
left.join(right, on='key')

19、join|按索引(多个)

重新产生数据并按下图所示进行连接(根据 key1 和 key2)

left = pd.DataFrame({'A': ['A0''A1''A2''A3'],
                     'B': ['B0''B1''B2''B3'],
                     'key1': ['K0''K0''K1''K2'],
                     'key2': ['K0''K1''K0''K1']})


index = pd.MultiIndex.from_tuples([('K0''K0'), ('K1''K0'),
                                  ('K2''K0'), ('K2''K1')])


right = pd.DataFrame({'C': ['C0''C1''C2''C3'],
                   'D': ['D0''D1''D2''D3']},
                  index=index)
left.join(right, on=['key1''key2'])

分类:

后端

标签:

Python

作者介绍

江流儿
V1