当前位置 博文首页 > 哆啦梦乐园:[Python] Pandas 对数据进行查找、替换、筛选、排序
产品统计表.7z
import pandas as pd
data = pd.read_csv('D:\git\python\code\第5章\产品统计表.csv')
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
>>> data.isin(['钱包','005'])
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元)
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 False 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
>>> data['产品'].isin(['手提包'])
0 False
1 False
2 False
3 True
4 False
5 False
6 False
Name: 产品, dtype: bool
说明:
将数据表中的值“背包”全部替换为“挎包”。replace()函数括号中逗号前面的参数是需要替换的值,逗号后面的参数是替换后的值。
参数inplace默认是不对原表替换,设置为True则原表上替换。
>>> 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
>>> data.replace(['背包','手提包'], '挎包')
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元)
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
多对多替换可以看成是多个一对一替换。
>>> data.replace({'背包':'挎包', 16:39, 65:68}, inplace=True)
>>> print(data)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元)
0 a001 挎包 39 68 60 960 3900 2940
1 a002 钱包 90 187 50 4500 9350 4850
2 a003 挎包 39 68 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
pandas模块没有专门提供插入行的方法,因此,插入数据主要是指插入一列新的数据。常用的方法有两种:
>>> data = pd.read_csv('D:\git\python\code\第5章\产品统计表.csv')
>>> 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
>>> data.insert(2, '产地', ['北京','深圳','成都','杭州','上海','重庆','武汉'])
>>> 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
使用pandas模块中的drop()函数。该函数既可以删除指定的列,也可以删除指定的行。
在drop()函数中直接给出要删除的列的列标签就可以删除列。
>>> data.drop(['成本价(元/个)', '成本(元)'], axis=1)
编号 产品 产地 销售价(元/个) 数量(个) 收入(元) 利润(元) 品牌
0 a001 背包 北京 65 60 3900 2940 AM
1 a002 钱包 深圳 187 50 9350 4850 DE
2 a003 背包 成都 65 23 1495 1127 SR
3 a004 手提包 杭州 147 26 3822 2886 AM
4 a005 钱包 上海 187 78 14586 7566 TY
5 a006 单肩包 重庆 124 63 7812 4158 DE
6 a007 单肩包 武汉 124 58 7192 3828 UD
drop()函数设置了两个参数:
# 这3个效果一样
data.drop(data.columns[[3,6]], axis=1)
data.drop(['成本价(元/个)', '成本(元)'], axis=1)
data.drop(columns=['成本价(元/个)', '成本(元)'], axis=1)
删除行的方法和删除列的方法类似,都要用到drop()函数,只不过需要将参数axis设置为0,其缺省值是0,可以不设。
>>> data = pd.read_csv('D:\git\python\code\第5章\产品统计表.csv', index_col=0)
>>> data.drop(['a001','a003'], axis=0)
产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元)
编号
a002 钱包 90 187 50 4500 9350 4850
a004 手提包 36 147 26 936 3822 2886
a005 钱包 90 187 78 7020 14586 7566
a006 单肩包 58 124 63 3654 7812 4158
a007 单肩包 58 124 58 3364 7192 3828
和删除列类似.
# 这3个效果一样,只不过在使用第2种时,读文件时,可以不用index-col参数
data.drop(['a001','a003'], axis=0)
data.drop(data.index[[0,2]])
data.drop(index=['a001','a003'])
产品统计表1.7z
在Python中,缺失值一般用NaN表示。从运行结果可以看出,数据表的第3行和第7行含有缺失值。
>>> data = pd.read_csv('D:\git\python\code\第5章\产品统计表1.csv')
>>> 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
如果要查看每一列的缺失值情况,可以使用pandas模块中的info()函数。
>>> print(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
None
从运行结果可以看出,“成本价(元/个)”列和“成本(元)”列都是“6 non-null”,表示这两列都有6个非空值,而其他列都有7个非空值,说明这两列各有1个空值(即缺失值)。
使用isnull()函数判断数据表中的哪个值是缺失值,并将缺失值标记为True,非缺失值标记为False。
>>> 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
使用dropna()函数可以删除数据表中含有缺失值的行。默认情况下,只要某一行中有缺失值,该函数就会把这一行删除。
>>> 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
如果只想删除整行都为缺失值的行,则需要为dropna()函数设置参数how的值为'all'。
c = data.dropna(how='all')
print(c)
使用fillna()函数可以将数据表中的所有缺失值填充为指定的值。
>>> d = data.fillna(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
可以通过为fillna()函数传入一个字典,为不同列中的缺失值设置不同的填充值。
>>> 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
重复值的常用处理操作包括删除重复值和提取唯一值,前者可以使用drop_duplicates()函数来完成,后者可以使用unique()函数来完成。
数据文件:产品统计表2.7z
>>> data = pd.read_excel('D:\git\python\code\第5章\产品统计表2.xlsx')
>>> data = data.dropna(how='all')
>>> print(data)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元)
0 a001 背包 16.0 65.0 60.0 960.0 3900.0 2940.0
1 a002 钱包 90.0 187.0 50.0 4500.0 9350.0 4850.0
2 a003 背包 16.0 65.0 23.0 368.0 1495.0 1127.0
3 a004 手提包 36.0 147.0 26.0 936.0 3822.0 2886.0
4 a004 手提包 36.0 147.0 26.0 936.0 3822.0 2886.0
5 a005 钱包 90.0 187.0 78.0 7020.0 14586.0 7566.0
6 a006 单肩包 58.0 124.0 63.0 3654.0 7812.0 4158.0
上述数据表的第4行和第5行中每列数据都完全相同,这样的行称为重复行。如果要只保留第4行,删除与第4行重复的行,可直接使用drop_duplicates()函数,无须设置任何参数。
>>> a = data.drop_duplicates()
>>> print(a)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元)
0 a001 背包 16.0 65.0 60.0 960.0 3900.0 2940.0
1 a002 钱包 90.0 187.0 50.0 4500.0 9350.0 4850.0
2 a003 背包 16.0 65.0 23.0 368.0 1495.0 1127.0
3 a004 手提包 36.0 147.0 26.0 936.0 3822.0 2886.0
5 a005 钱包 90.0 187.0 78.0 7020.0 14586.0 7566.0
6 a006 单肩包 58.0 124.0 63.0 3654.0 7812.0 4158.0
>>> b = data.drop_duplicates(subset='产品')
>>> print(b)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元)
0 a001 背包 16.0 65.0 60.0 960.0 3900.0 2940.0
1 a002 钱包 90.0 187.0 50.0 4500.0 9350.0 4850.0
3 a004 手提包 36.0 147.0 26.0 936.0 3822.0 2886.0
6 a006 单肩包 58.0 124.0 63.0 3654.0 7812.0 4158.0
默认保留第一个重复值所在的行,删除其他重复值所在的行。
可以利用drop_duplicates()函数的参数keep来自定义删除重复值时保留哪个重复值所在的行。
例如:
使用pandas模块中的unique()函数可以获取某一列数据的唯一值。
>>> f = data['产品'].unique()
>>> print(f)
['背包' '钱包' '手提包' '单肩包']
说明:获取的唯一值是按照其在数据表中出现的顺序排列的。
排序数据主要会用到sort_values()函数和rank()函数。
sort_values()函数的常用参数有两个:
>>> a = data.sort_values(by='数量(个)', ascending=True)
>>> print(a)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元)
2 a003 背包 16.0 65.0 23.0 368.0 1495.0 1127.0
3 a004 手提包 36.0 147.0 26.0 936.0 3822.0 2886.0
4 a004 手提包 36.0 147.0 26.0 936.0 3822.0 2886.0
1 a002 钱包 90.0 187.0 50.0 4500.0 9350.0 4850.0
0 a001 背包 16.0 65.0 60.0 960.0 3900.0 2940.0
6 a006 单肩包 58.0 124.0 63.0 3654.0 7812.0 4158.0
5 a005 钱包 90.0 187.0 78.0 7020.0 14586.0 7566.0
rank()函数的常用参数有两个:
rank初次接触不好理解,第10小节专门解释一下。
>>> b = data['利润(元)'].rank(method='average', ascending=False)
>>> print(b)
0 4.0
1 2.0
2 7.0
3 5.5
4 5.5
5 1.0
6 3.0
rank是通过“为各组分配一个平均排名”的方式破坏平级关系的。pandas排名会增加一个排名值(从1开始,一直到数组中有效数据的数量)。
函数原型:
rank(axis=0, method: str = 'average', numeric_only: Union[bool, NoneType] = None, na_option: str = 'keep', ascending: bool = True, pct: bool = False)
官方文档:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.rank.html
假设创建了一个Series对象obj = Series([7, -5, 7, 4, 2, 0, 4]),就是上图中”索引“和”值“这两列,我们人为的按照值的大小进行了一个排名,并且产生了一个序列(”人为的排名“)这一列,关于有两个索引(0和2)的值都是7的这种情况的排名的规则是,首先出现的值排名靠前。
下面就来说一下method参数的作用。
>>> data = pd.read_csv('D:\git\python\code\第5章\产品统计表.csv')
>>> 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]
>>> print(b)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元)
4 a005 钱包 90 187 78 7020 14586 7566
5 a006 单肩包 58 124 63 3654 7812 4158
如果要进行多条件筛选,并且这些条件之间是“逻辑与”的关系,可以用“&”符号连接多个筛选条件。
需要注意的是,每个条件要分别用括号括起来。
>>> c = data[(data['产品'] == '单肩包') & (data['数量(个)'] > 60)]
>>> print(c)
编号 产品 成本价(元/个) 销售价(元/个) 数量(个) 成本(元) 收入(元) 利润(元)
5 a006 单肩包 58 124 63 3654 7812 4158
要进行多条件筛选,并且这些条件之间是“逻辑或”的关系,可以用“|”符号连接多个筛选条件,每个条件也要分别用括号括起来。