江流儿
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=[0, 1, 2, 3])
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7])
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']},
index=[8, 9, 10, 11])
df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
'D': ['D2', 'D3', 'D6', 'D7'],
'F': ['F2', 'F3', 'F6', 'F7']},
index=[2, 3, 6, 7])

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': [1, 2, 3]})
right = pd.DataFrame({'k': ['K0', 'K0', 'K3'], 'v': [4, 5, 6]})
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'])
作者介绍