3.2.5 排序数据:sort_values()、rank()
1. sort_values()
import pandas as pd data = pd.read_excel('产品统计表2.xlsx') a = data.sort_values(by = '数量(个)', ascending = True) #第一个参数指定列 第二个参数指定升序 print(a)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 2 a003 背包 16 65 23 368 1495 1127 3 a004 手提包 36 147 26 936 3822 2886 4 a004 手提包 36 147 26 936 3822 2886 1 a002 钱包 90 187 50 4500 9350 4850 0 a001 背包 16 65 60 960 3900 2940 6 a006 单肩包 58 124 63 3654 7812 4158 5 a005 钱包 90 187 78 7020 14586 7566
例:降序如下
b = data.sort_values(by = '数量(个)', ascending = False) print(b)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 5 a005 钱包 90 187 78 7020 14586 7566 6 a006 单肩包 58 124 63 3654 7812 4158 0 a001 背包 16 65 60 960 3900 2940 1 a002 钱包 90 187 50 4500 9350 4850 3 a004 手提包 36 147 26 936 3822 2886 4 a004 手提包 36 147 26 936 3822 2886 2 a003 背包 16 65 23 368 1495 1127
2. rank()
c = data['利润(元)'].rank(method = 'average', ascending = False) #指定利润降序排序 有重复值则返回重复值的平均排名 print(c)
0 4.0 1 2.0 2 7.0 3 5.5 4 5.5 5 1.0 6 3.0 Name: 利润(元), dtype: float64
参数指定first时,表示在数据有重复值时,越先出现的数据排名越靠前
d = data['利润(元)'].rank(method = 'first', ascending = False) print(d)
0 4.0 1 2.0 2 7.0 3 5.0 4 6.0 5 1.0 6 3.0 Name: 利润(元), dtype: float64
3.2.6 筛选数据
获取产品为单肩包的行数据
import pandas as pd data = pd.read_excel('产品统计表.xlsx') a = data[data['产品'] == '单肩包'] #获取产品为单肩包的行数据 print(a)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 5 a006 单肩包 58 124 63 3654 7812 4158 6 a007 单肩包 58 124 58 3364 7192 3828
获取数量>60的行数据
b = data[data['数量(个)'] > 60] # 获取数量>60的行数据 print(b)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 4 a005 钱包 90 187 78 7020 14586 7566 5 a006 单肩包 58 124 63 3654 7812 4158
获取产品为单肩包 且 数量>60 的行数据
c = data[(data['产品'] == '单肩包') & (data['数量(个)'] > 60)] print(c)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 5 a006 单肩包 58 124 63 3654 7812 4158
获取产品为单肩包 或 数量>60 的行数据
d = data[(data['产品'] == '单肩包') | (data['数量(个)'] > 60)] print(d)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 4 a005 钱包 90 187 78 7020 14586 7566 5 a006 单肩包 58 124 63 3654 7812 4158 6 a007 单肩包 58 124 58 3364 7192 3828
3.3 数据表的处理
3.3.1 转置表的行列:T
import pandas as pd data = pd.read_excel('产品统计表.xlsx') a = data.T print(a)
0 1 2 3 4 5 6 编号 a001 a002 a003 a004 a005 a006 a007 产品 背包 钱包 背包 手提包 钱包 单肩包 单肩包 成本价(元/个) 16 90 16 36 90 58 58 销售价(元/个) 65 187 65 147 187 124 124 数量(个) 60 50 23 26 78 63 58 成本(元) 960 4500 368 936 7020 3654 3364 收入(元) 3900 9350 1495 3822 14586 7812 7192 利润(元) 2940 4850 1127 2886 7566 4158 3828
3.3.2 将表转换成树形结构:stack()
编号 产品 销售价(元/个) 数量(个) 收入(元) 0 a001 背包 65 60 3900 1 a002 钱包 187 50 9350 2 a003 单肩包 124 58 7192
例:stack()函数转换成树形结构
a = data.stack() print(a)
0 编号 a001 产品 背包 销售价(元/个) 65 数量(个) 60 收入(元) 3900 1 编号 a002 产品 钱包 销售价(元/个) 187 数量(个) 50 收入(元) 9350 2 编号 a003 产品 单肩包 销售价(元/个) 124 数量(个) 58 收入(元) 7192 dtype: object
3.3.3 表的拼接:merge()、concat()、append()
import pandas as pd data1 = pd.read_excel('产品表.xlsx', sheet_name = 0) #第0张工作簿 data2 = pd.read_excel('产品表.xlsx',sheet_name = 1) #第1张工作簿 print(data1) print(data2)
员工编号 员工姓名 员工性别 0 a001 张三 男 1 a002 李四 女 2 a003 王五 男 3 a004 赵六 男 员工编号 员工姓名 销售业绩 0 a001 张三 360000 1 a002 李四 458000 2 a003 王五 369000 3 a004 赵六 450000 4 a005 钱七 500000
1. merge()
a = pd.merge(data1, data2) #行取交集 列取并集 print(a)
员工编号 员工姓名 员工性别 销售业绩 0 a001 张三 男 360000 1 a002 李四 女 458000 2 a003 王五 男 369000 3 a004 赵六 男 450000
how参数指定外连接
b = pd.merge(data1, data2, how = 'outer') #行取并集 列取并集 print(b)
员工编号 员工姓名 员工性别 销售业绩 0 a001 张三 男 360000 1 a002 李四 女 458000 2 a003 王五 男 369000 3 a004 赵六 男 450000 4 a005 钱七 NaN 500000
on参数指定按哪一列合并
c = pd.merge(data1, data2, on = '员工姓名') print(c)
员工编号_x 员工姓名 员工性别 员工编号_y 销售业绩 0 a001 张三 男 a001 360000 1 a002 李四 女 a002 458000 2 a003 王五 男 a003 369000 3 a004 赵六 男 a004 450000
2. concat()
concat()函数采用全连接的方式,没有的数设置为缺失值
d = pd.concat([data1, data2]) print(d)
员工编号 员工姓名 员工性别 销售业绩 0 a001 张三 男 NaN 1 a002 李四 女 NaN 2 a003 王五 男 NaN 3 a004 赵六 男 NaN 0 a001 张三 NaN 360000.0 1 a002 李四 NaN 458000.0 2 a003 王五 NaN 369000.0 3 a004 赵六 NaN 450000.0 4 a005 钱七 NaN 500000.0
重置行标签
e = pd.concat([data1, data2], ignore_index = True) #重置行标签 print(e)
员工编号 员工姓名 员工性别 销售业绩 0 a001 张三 男 NaN 1 a002 李四 女 NaN 2 a003 王五 男 NaN 3 a004 赵六 男 NaN 4 a001 张三 NaN 360000.0 5 a002 李四 NaN 458000.0 6 a003 王五 NaN 369000.0 7 a004 赵六 NaN 450000.0 8 a005 钱七 NaN 500000.0
3. append()
效果与concat()全连接一样
f = data1.append(data2) print(f)
员工编号 员工姓名 员工性别 销售业绩 0 a001 张三 男 NaN 1 a002 李四 女 NaN 2 a003 王五 男 NaN 3 a004 赵六 男 NaN 0 a001 张三 NaN 360000.0 1 a002 李四 NaN 458000.0 2 a003 王五 NaN 369000.0 3 a004 赵六 NaN 450000.0 4 a005 钱七 NaN 500000.0
末尾添加行元素
g = data1.append({'员工编号':'a005', '员工姓名':'孙七', '员工性别':'男'}, ignore_index = True) print(g)
员工编号 员工姓名 员工性别 0 a001 张三 男 1 a002 李四 女 2 a003 王五 男 3 a004 赵六 男 4 a005 孙七 男
3.4 数据的运算
3.4.1 统计运算:sum()、mean()、max()
1. 求和:sum()
import pandas as pd data = pd.read_excel('产品统计表.xlsx') a = data.sum() # 每一列求和 print(a)
编号 a001a002a003a004a005a006a007 产品 背包钱包背包手提包钱包单肩包单肩包 成本价(元/个) 364 销售价(元/个) 899 数量(个) 358 成本(元) 20802 收入(元) 48157 利润(元) 27355 dtype: object
例:指定列求和
b = data['利润(元)'].sum() print(b)
27355
2. 求平均值:mean()
c = data.mean() #每一列求平均值 print(c)
成本价(元/个) 52.000000 销售价(元/个) 128.428571 数量(个) 51.142857 成本(元) 2971.714286 收入(元) 6879.571429 利润(元) 3907.857143 dtype: float64
例:指定列求均值
d = data['利润(元)'].mean() print(d)
3907.8571428571427
3. 求最值:max()
e = data.max() print(e)
编号 a007 产品 钱包 成本价(元/个) 90 销售价(元/个) 187 数量(个) 78 成本(元) 7020 收入(元) 14586 利润(元) 7566 dtype: object
例:指定列求最值
f = data['利润(元)'].max() print(f)
7566
3.4.2 获取数值分布情况:describe()
import pandas as pd data = pd.read_excel('产品统计表.xlsx') a = data.describe() print(a)
成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) count 7.000000 7.000000 7.000000 7.000000 7.000000 7.000000 mean 52.000000 128.428571 51.142857 2971.714286 6879.571429 3907.857143 std 31.112698 50.483849 20.053500 2391.447659 4352.763331 2002.194498 min 16.000000 65.000000 23.000000 368.000000 1495.000000 1127.000000 25% 26.000000 94.500000 38.000000 948.000000 3861.000000 2913.000000 50% 58.000000 124.000000 58.000000 3364.000000 7192.000000 3828.000000 75% 74.000000 167.000000 61.500000 4077.000000 8581.000000 4504.000000 max 90.000000 187.000000 78.000000 7020.000000 14586.000000 7566.000000
例:获取单列的情况
b = data['利润(元)'].describe() print(b)
count 7.000000 mean 3907.857143 std 2002.194498 min 1127.000000 25% 2913.000000 50% 3828.000000 75% 4504.000000 max 7566.000000 Name: 利润(元), dtype: float64
3.4.3 计算相关系数:corr()
import pandas as pd data = pd.read_excel('相关性分析.xlsx') print(data)
代理商编号 年销售额(万元) 年广告费投入额(万元) 成本费用(万元) 管理费用(万元) 0 A-001 20.5 15.6 2.00 0.80 1 A-003 24.5 16.7 2.54 0.94 2 B-002 31.8 20.4 2.96 0.88 3 B-006 34.9 22.6 3.02 0.79 4 B-008 39.4 25.7 3.14 0.84 5 C-003 44.5 28.8 4.00 0.80 6 C-004 49.6 32.1 6.84 0.85 7 C-007 54.8 35.9 5.60 0.91 8 D-006 58.5 38.7 6.45 0.90
corr()函数获取相关系数
a = data.corr() print(a)
年销售额(万元) 年广告费投入额(万元) 成本费用(万元) 管理费用(万元) 年销售额(万元) 1.000000 0.996275 0.914428 0.218317 年广告费投入额(万元) 0.996275 1.000000 0.918404 0.223187 成本费用(万元) 0.914428 0.918404 1.000000 0.284286 管理费用(万元) 0.218317 0.223187 0.284286 1.000000
例:获取指定列与其他列的相关系数
b = data.corr()['年销售额(万元)'] print(b)
年销售额(万元) 1.000000 年广告费投入额(万元) 0.996275 成本费用(万元) 0.914428 管理费用(万元) 0.218317 Name: 年销售额(万元), dtype: float64
3.4.4 分组汇总数据:groupby()
import pandas as pd data = pd.read_excel('产品统计表.xlsx') a = data.groupby('产品') #根据产品列分组 print(a)
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x00000213943E4640>
groupby()函数返回的是一个DataFrameBy对象,该对象包含分组后的数据,但是不能直观地显示出来。
b = data.groupby('产品').sum() print(b)
成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 产品 单肩包 116 248 121 7018 15004 7986 手提包 36 147 26 936 3822 2886 背包 32 130 83 1328 5395 4067 钱包 180 374 128 11520 23936 12416
分组后获取指定列的汇总情况
c = data.groupby('产品')['利润(元)'].sum() print(c)
产品 单肩包 7986 手提包 2886 背包 4067 钱包 12416 Name: 利润(元), dtype: int64
获取多列的汇总情况
d = data.groupby('产品')['数量(个)', '利润(元)'].sum() print(d)
数量(个) 利润(元) 产品 单肩包 121 7986 手提包 26 2886 背包 83 4067 钱包 128 12416
3.4.5 创建数据透视表:pivot_table()
- values参数用于指定要计算的列
- index参数用于指定一个列作为数据透视表的行标签
- aggfunc参数用于指定参数values的计算类型
import pandas as pd data = pd.read_excel('产品统计表.xlsx') a = pd.pivot_table(data, values = '利润(元)', index = '产品', aggfunc = 'sum') #data.groupby('产品')['利润(元)'].sum() 同样功能 print(a)
利润(元) 产品 单肩包 7986 手提包 2886 背包 4067 钱包 12416
获取多列的情况
b = pd.pivot_table(data, values = ['利润(元)', '成本(元)'], index = '产品', aggfunc = 'sum') print(b)
利润(元) 成本(元) 产品 单肩包 7986 7018 手提包 2886 936 背包 4067 1328 钱包 12416 11520