DataFrame按条件筛选、修改数据:df.loc[]拓展
创建一个DataFrame
先通过字典创建一个学生信息的DataFrame。
import pandas as pd
Student_dict = {'姓名':['张三', '李四', '王五', '赵六'],
'性别':['男', '女', '男', '女'],
'年龄':[20, 21, 19, 18],
'Python成绩':[70, 80, 90, 50],
'评价':['良好', '良好', '良好', '良好'],
'地址':['A小区10幢', 'A小区11幢','B小区10幢','C小区11幢']}
字典创建DataFrame,字典键变DataFrame的列名
df = pd.DataFrame(data=Student_dict, index=['a','b','c','d'])
df.loc[]按某列条件筛选行数据
df.loc[]可以通过布尔列表筛选行数据。比如筛选前两行数据:
df.loc[[True, True, False, False]]
通过布尔列表的方式,可以衍生出下面按条件的选取方式。比如筛选Python成绩>75的学生:
df.loc[df['Python成绩'] > 75] # df.loc[]删选Python成绩>75的学生
除了单个条件,也可以用两个条件筛选数据。比如筛选Python成绩>75的学生,并且年龄>20的学生:
df.loc[(df['Python成绩'] > 75) & (df['年龄'] > 20)] # df.loc[]删选Python成绩>75的学生,并且年龄>20的学生
注:df.loc[]多条件删选数据时,不同条件需要用(),连接条件如果是且符号是'&',连接条件如果是或符号是'|'。
df.loc[]按某列条件筛选并修改行数据
上面我们学习了如何筛选数据,那么如何筛选并改变数据呢?
日常工作中我们常常需要通过某个条件,去改变DataFrame数据。
比如,我想把Python成绩>=90的学习,评价设置为'优秀':
df.loc[df['Python成绩'] >= 90, '评价'] = '优秀'
df.loc[]筛选并改变数据,需要输入两个参数:
- 参数1:筛选的条件。
- 参数2:要改变列的列名。
判断某列数据中是否包含特定字符串或字符串列表
拓展一下df.loc[]筛选数据时常用的条件,判断某列数据中是否包含特定字符串或字符串列表。
比如我想筛选地址包含'A小区'的学生,应该怎么操作?
比如我想筛选地址包含'A小区'或'B小区'的学生,应该怎么操作?
判断某列数据中是否包含特定字符串
筛选地址包含'A小区'的学生:
df.loc[df['地址'].str.contains('A小区')] # df.loc[]删选地址中包含A小区的学生
df['地址'].str.contains('A小区')说明:
df['地址'].str,就是对df['地址']进行str操作,str下有很多很多方法,其中contains()是其中一种方法,作用是用来判断是否包含'A小区'。
df['xx'].str除了contains方法外,还有cat、split、partition、rpartition、get、slice、slice_replace、join、startswith、endswith、match、replace、repeat、pad、zfill等等方法。
判断某列数据中是否包含特定字符串列表
筛选地址包含'A小区'或'B小区'的学生:
聪明的同学会想到先获取'A小区'的学生,再获取'B小区'的学生,这是可行的。
不过怎样可以一步实现呢?直接放入列表行不行?让我们来试一下。
直接放入列表试试:
xiaoqu_list = ['A小区', 'B小区']
df.loc[df['地址'].str.contains(xiaoqu_list)]
TypeError: unhashable type: 'list'
报错啦,不支持输入列表。
解决方法是将列表用'|'进行连接,这样就可以一次性筛选出来了。
xiaoqu_list = ['A小区', 'B小区']
xiaoqu_str = '|'.join(xiaoqu_list)
df[df['地址'].str.contains(xiaoqu_str)]
说明:
'|'.join(xiaoqu_list),是将xiaoqu_list列表用'|'拼接起来,生成一个str字符串。然后就可以一次性筛选地址包含'A小区'或'B小区'的学生了。