2.5 修改行列标签:columns、index、set_index()
先查看一下数据
import pandas as pd data = pd.read_excel('订单表.xlsx', sheet_name=3) print(data)
订单编号 产品 数量 金额 0 d001 投影仪 5台 2000 1 d002 马克笔 5盒 300 2 d003 打印机 1台 298 3 d004 点钞机 1台 349 4 d005 复印纸 2箱 100 5 d006 条码纸 6卷 34
set_index()设置行标签
import pandas as pd data = pd.read_excel('订单表.xlsx', sheet_name=3) print(data.set_index('订单编号')) #订单编号那一列为行标签
产品 数量 金额 订单编号 d001 投影仪 5台 2000 d002 马克笔 5盒 300 d003 打印机 1台 298 d004 点钞机 1台 349 d005 复印纸 2箱 100 d006 条码纸 6卷 34
例:字典一对一修改
import pandas as pd data = pd.read_excel('订单表.xlsx', sheet_name=3) data = data.rename(columns={'订单编号':'编号', '产品':'产品名称', '数量':'订单数量', '金额':'订单金额'}, index = {0:'A', 1:'B', 2:'C', 3:'D', 4:'E', 5:'F'}) print(data)
编号 产品名称 订单数量 订单金额 A d001 投影仪 5台 2000 B d002 马克笔 5盒 300 C d003 打印机 1台 298 D d004 点钞机 1台 349 E d005 复印纸 2箱 100 F d006 条码纸 6卷 34
columns、index参数分别修改列、行标签
import pandas as pd data = pd.read_excel('订单表.xlsx', sheet_name=3) data.columns = ['编号', '产品名称', '订单数量', '订单金额'] data.index = ['A', 'B', 'C', 'D', 'E', 'F'] print(data)
编号 产品名称 订单数量 订单金额 A d001 投影仪 5台 2000 B d002 马克笔 5盒 300 C d003 打印机 1台 298 D d004 点钞机 1台 349 E d005 复印纸 2箱 100 F d006 条码纸 6卷 34
三. pandas进阶
3.1 数据的查找和替换
3.1.1 查找:isin()
import pandas as pd data = pd.read_excel('产品统计表.xlsx') print(data)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 0 a001 背包 16 65 60 960 3900 2940 1 a002 钱包 90 187 50 4500 9350 4850 2 a003 背包 16 65 23 368 1495 1127 3 a004 手提包 36 147 26 936 3822 2886 4 a005 钱包 90 187 78 7020 14586 7566 5 a006 单肩包 58 124 63 3654 7812 4158 6 a007 单肩包 58 124 58 3364 7192 3828
例:isin()函数查看表中是否有该值
data1 = data.isin(['a005','钱包']) # 查找a005 或 钱包 print(data1)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 0 False False False False False False False False 1 False True False False False False False False 2 False False False False False False False False 3 False False False False False False False False 4 True True False False False False False False 5 False False False False False False False False 6 False False False False False False False False
例:查看特定列是否有某值
data2 = data['产品'].isin(['手提包']) print(data2)
0 False 1 False 2 False 3 True 4 False 5 False 6 False Name: 产品, dtype: bool
3.1.2 替换:replace()
import pandas as pd data = pd.read_excel('产品统计表.xlsx') data.replace('背包', '挎包') #并没有替换 print(data)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 0 a001 背包 16 65 60 960 3900 2940 1 a002 钱包 90 187 50 4500 9350 4850 2 a003 背包 16 65 23 368 1495 1127 3 a004 手提包 36 147 26 936 3822 2886 4 a005 钱包 90 187 78 7020 14586 7566 5 a006 单肩包 58 124 63 3654 7812 4158 6 a007 单肩包 58 124 58 3364 7192 3828
可以看出上述代码并没有替换,那怎么替换呢?
1. 一对一替换
import pandas as pd data = pd.read_excel('产品统计表.xlsx') data.replace('背包', '挎包', inplace = True) # 加入inplace=True print(data)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 0 a001 挎包 16 65 60 960 3900 2940 1 a002 钱包 90 187 50 4500 9350 4850 2 a003 挎包 16 65 23 368 1495 1127 3 a004 手提包 36 147 26 936 3822 2886 4 a005 钱包 90 187 78 7020 14586 7566 5 a006 单肩包 58 124 63 3654 7812 4158 6 a007 单肩包 58 124 58 3364 7192 3828
2. 多对一替换
import pandas as pd data = pd.read_excel('产品统计表.xlsx') data.replace(['背包', '手提包'], '挎包', inplace = True) print(data)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 0 a001 挎包 16 65 60 960 3900 2940 1 a002 钱包 90 187 50 4500 9350 4850 2 a003 挎包 16 65 23 368 1495 1127 3 a004 挎包 36 147 26 936 3822 2886 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. 多对多替换
import pandas as pd data = pd.read_excel('产品统计表.xlsx') data.replace({'背包':'挎包', 16:39, 65:88}, inplace = True) print(data)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 0 a001 挎包 39 88 60 960 3900 2940 1 a002 钱包 90 187 50 4500 9350 4850 2 a003 挎包 39 88 23 368 1495 1127 3 a004 手提包 36 147 26 936 3822 2886 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.2 数据的处理
3.2.1 插入:insert()
例:末尾插入一列
import pandas as pd data = pd.read_excel('产品统计表.xlsx') data['品牌'] = ['AM', 'DE', 'SR', 'AM', 'TY', 'DE', 'UD'] print(data)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 品牌 0 a001 背包 16 65 60 960 3900 2940 AM 1 a002 钱包 90 187 50 4500 9350 4850 DE 2 a003 背包 16 65 23 368 1495 1127 SR 3 a004 手提包 36 147 26 936 3822 2886 AM 4 a005 钱包 90 187 78 7020 14586 7566 TY 5 a006 单肩包 58 124 63 3654 7812 4158 DE 6 a007 单肩包 58 124 58 3364 7192 3828 UD
例:指定插入到哪列
import pandas as pd data = pd.read_excel('产品统计表.xlsx') data.insert(2, '品牌', ['AM', 'DE', 'SR', 'AM', 'TY', 'DE', 'UD']) print(data)
编号 产品 品牌 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 0 a001 背包 AM 16 65 60 960 3900 2940 1 a002 钱包 DE 90 187 50 4500 9350 4850 2 a003 背包 SR 16 65 23 368 1495 1127 3 a004 手提包 AM 36 147 26 936 3822 2886 4 a005 钱包 TY 90 187 78 7020 14586 7566 5 a006 单肩包 DE 58 124 63 3654 7812 4158 6 a007 单肩包 UD 58 124 58 3364 7192 3828
3.2.2 删除:drop()
axis参数可以指定删除行还是删除列
1. 删除列
例:指定标签删除
import pandas as pd data = pd.read_excel('产品统计表.xlsx') a = data.drop(['成本价(元/个)', '成本(元)'], axis = 1) print(a)
编号 产品 销售价(元/个) 数量(个) 收入(元) 利润(元) 0 a001 背包 65 60 3900 2940 1 a002 钱包 187 50 9350 4850 2 a003 背包 65 23 1495 1127 3 a004 手提包 147 26 3822 2886 4 a005 钱包 187 78 14586 7566 5 a006 单肩包 124 63 7812 4158 6 a007 单肩包 124 58 7192 3828
例:指定索引删除
import pandas as pd data = pd.read_excel('产品统计表.xlsx') b = data.drop(data.columns[[2, 5]], axis = 1) print(b)
编号 产品 销售价(元/个) 数量(个) 收入(元) 利润(元) 0 a001 背包 65 60 3900 2940 1 a002 钱包 187 50 9350 4850 2 a003 背包 65 23 1495 1127 3 a004 手提包 147 26 3822 2886 4 a005 钱包 187 78 14586 7566 5 a006 单肩包 124 63 7812 4158 6 a007 单肩包 124 58 7192 3828
方法三
import pandas as pd data = pd.read_excel('产品统计表.xlsx') c = data.drop(columns = ['成本价(元/个)', '成本(元)']) print(c)
编号 产品 销售价(元/个) 数量(个) 收入(元) 利润(元) 0 a001 背包 65 60 3900 2940 1 a002 钱包 187 50 9350 4850 2 a003 背包 65 23 1495 1127 3 a004 手提包 147 26 3822 2886 4 a005 钱包 187 78 14586 7566 5 a006 单肩包 124 63 7812 4158 6 a007 单肩包 124 58 7192 3828
2. 删除行
例:指定行标签删除
import pandas as pd data = pd.read_excel('产品统计表.xlsx', index_col = 0) a = data.drop(['a001', 'a004'], axis = 0) print(a)
产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 编号 a002 钱包 90 187 50 4500 9350 4850 a003 背包 16 65 23 368 1495 1127 a005 钱包 90 187 78 7020 14586 7566 a006 单肩包 58 124 63 3654 7812 4158 a007 单肩包 58 124 58 3364 7192 3828
例:指定索引删除
import pandas as pd data = pd.read_excel('产品统计表.xlsx', index_col = 0) b = data.drop(data.index[[0, 4]], axis = 0) print(b)
产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 编号 a002 钱包 90 187 50 4500 9350 4850 a003 背包 16 65 23 368 1495 1127 a004 手提包 36 147 26 936 3822 2886 a006 单肩包 58 124 63 3654 7812 4158 a007 单肩包 58 124 58 3364 7192 3828
方法三:
import pandas as pd data = pd.read_excel('产品统计表.xlsx', index_col = 0) c = data.drop(index = ['a001', 'a004']) print(c)
产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 编号 a002 钱包 90 187 50 4500 9350 4850 a003 背包 16 65 23 368 1495 1127 a005 钱包 90 187 78 7020 14586 7566 a006 单肩包 58 124 63 3654 7812 4158 a007 单肩包 58 124 58 3364 7192 3828
3.2.3 处理缺失值:isnulll()、dropna()、fillna()
import pandas as pd data = pd.read_excel('产品统计表1.xlsx') print(data)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 0 a001 背包 16.0 65 60 960.0 3900 2940 1 a002 钱包 90.0 187 50 4500.0 9350 4850 2 a003 背包 NaN 65 23 368.0 1495 1127 3 a004 手提包 36.0 147 26 936.0 3822 2886 4 a005 钱包 90.0 187 78 7020.0 14586 7566 5 a006 单肩包 58.0 124 63 3654.0 7812 4158 6 a007 单肩包 58.0 124 58 NaN 7192 3828
info()函数查看数据类型,还可以查看是否有缺失值
import pandas as pd data = pd.read_excel('产品统计表1.xlsx') data.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 7 entries, 0 to 6 Data columns (total 8 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 编号 7 non-null object 1 产品 7 non-null object 2 成本价(元/个) 6 non-null float64 3 销售价(元/个) 7 non-null int64 4 数量(个) 7 non-null int64 5 成本(元) 6 non-null float64 6 收入(元) 7 non-null int64 7 利润(元) 7 non-null int64 dtypes: float64(2), int64(4), object(2) memory usage: 576.0+ bytes
1. 查看缺失值:isnull()
isnull()函数查看是否有缺失值;在numpy模块中用isnan()函数
import pandas as pd data = pd.read_excel('产品统计表1.xlsx') a = data.isnull() print(a)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 0 False False False False False False False False 1 False False False False False False False False 2 False False True False False False False False 3 False False False False False False False False 4 False False False False False False False False 5 False False False False False False False False 6 False False False False False True False False
2. 删除缺失值:dropna()
例:删除有缺失值的行
import pandas as pd data = pd.read_excel('产品统计表1.xlsx') b = data.dropna() print(b)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 0 a001 背包 16.0 65 60 960.0 3900 2940 1 a002 钱包 90.0 187 50 4500.0 9350 4850 3 a004 手提包 36.0 147 26 936.0 3822 2886 4 a005 钱包 90.0 187 78 7020.0 14586 7566 5 a006 单肩包 58.0 124 63 3654.0 7812 4158
例:删除整行都为缺失值的行,需要指定how参数
import pandas as pd data = pd.read_excel('产品统计表1.xlsx') c = data.dropna(how = 'all') print(c)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 0 a001 背包 16.0 65 60 960.0 3900 2940 1 a002 钱包 90.0 187 50 4500.0 9350 4850 2 a003 背包 NaN 65 23 368.0 1495 1127 3 a004 手提包 36.0 147 26 936.0 3822 2886 4 a005 钱包 90.0 187 78 7020.0 14586 7566 5 a006 单肩包 58.0 124 63 3654.0 7812 4158 6 a007 单肩包 58.0 124 58 NaN 7192 3828
3. 缺失值的填充:fillna()
import pandas as pd data = pd.read_excel('产品统计表1.xlsx') d = data.fillna(0) # 缺失值全部填充为0 print(d)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 0 a001 背包 16.0 65 60 960.0 3900 2940 1 a002 钱包 90.0 187 50 4500.0 9350 4850 2 a003 背包 0.0 65 23 368.0 1495 1127 3 a004 手提包 36.0 147 26 936.0 3822 2886 4 a005 钱包 90.0 187 78 7020.0 14586 7566 5 a006 单肩包 58.0 124 63 3654.0 7812 4158 6 a007 单肩包 58.0 124 58 0.0 7192 3828
例:不同列的缺失值设置不同的填充值
import pandas as pd data = pd.read_excel('产品统计表1.xlsx') e = data.fillna({'成本价(元/个)':16, '成本(元)':3364}) print(e)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 0 a001 背包 16.0 65 60 960.0 3900 2940 1 a002 钱包 90.0 187 50 4500.0 9350 4850 2 a003 背包 16.0 65 23 368.0 1495 1127 3 a004 手提包 36.0 147 26 936.0 3822 2886 4 a005 钱包 90.0 187 78 7020.0 14586 7566 5 a006 单肩包 58.0 124 63 3654.0 7812 4158 6 a007 单肩包 58.0 124 58 3364.0 7192 3828
3.2.4 处理重复值:drop_duplicates()、subset、unique()
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 0 a001 背包 16 65 60 960 3900 2940 1 a002 钱包 90 187 50 4500 9350 4850 2 a003 背包 16 65 23 368 1495 1127 3 a004 手提包 36 147 26 936 3822 2886 4 a004 手提包 36 147 26 936 3822 2886 # 重复 5 a005 钱包 90 187 78 7020 14586 7566 6 a006 单肩包 58 124 63 3654 7812 4158
1. 删除重复行:drop_duplicates()
a = data.drop_duplicates() print(a)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 0 a001 背包 16 65 60 960 3900 2940 1 a002 钱包 90 187 50 4500 9350 4850 2 a003 背包 16 65 23 368 1495 1127 3 a004 手提包 36 147 26 936 3822 2886 5 a005 钱包 90 187 78 7020 14586 7566 6 a006 单肩包 58 124 63 3654 7812 4158
2. 删除某一列的重复值:subset
默认保留第一个重复值所在的行,删除其他重复值所在的行
b = data.drop_duplicates(subset = '产品') print(b)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 0 a001 背包 16 65 60 960 3900 2940 1 a002 钱包 90 187 50 4500 9350 4850 3 a004 手提包 36 147 26 936 3822 2886 6 a006 单肩包 58 124 63 3654 7812 4158
保留第一个重复值所在的行
c = data.drop_duplicates(subset = '产品', keep = 'first') print(c)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 0 a001 背包 16 65 60 960 3900 2940 1 a002 钱包 90 187 50 4500 9350 4850 3 a004 手提包 36 147 26 936 3822 2886 6 a006 单肩包 58 124 63 3654 7812 4158
保留最后一个重复值所在的行
d = data.drop_duplicates(subset = '产品', keep = 'last') print(d)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 2 a003 背包 16 65 23 368 1495 1127 4 a004 手提包 36 147 26 936 3822 2886 5 a005 钱包 90 187 78 7020 14586 7566 6 a006 单肩包 58 124 63 3654 7812 4158
是重复的就删除
e = data.drop_duplicates(subset = '产品', keep = False) print(e)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元) 6 a006 单肩包 58 124 63 3654 7812 4158
3. 获取唯一值:unique()
f = data['产品'].unique() print(f)
['背包' '钱包' '手提包' '单肩包']