问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

DataFrame按条件筛选、修改数据:df.loc[]拓展

创作时间:
2025-03-18 09:56:56
作者:
@小白创作中心

DataFrame按条件筛选、修改数据:df.loc[]拓展

引用
1
来源
1.
https://www.cnblogs.com/GreatPlanHero/p/18189296

本文将详细介绍Pandas库中DataFrame对象的loc属性的使用方法,包括如何按条件筛选数据、修改数据,以及一些进阶用法如判断某列数据是否包含特定字符串或字符串列表。通过具体的代码示例和解释,帮助读者理解这些功能的实现方式。

首先,我们创建一个学生信息的DataFrame:

import pandas as pd

Student_dict = {'姓名':['张三', '李四', '王五', '赵六'],
                '性别':['男', '女', '男', '女'],
                '年龄':[20, 21, 19, 18],
                'Python成绩':[70, 80, 90, 50],
                '评价':['良好', '良好', '良好', '良好'],
                '地址':['A小区10幢', 'A小区11幢','B小区10幢','C小区11幢']}

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小区'的学生了。

根据 dataframe 多条件修改多列

借方数量 贷方数量 数量单位
100 1000 公斤
0.2 2 吨
300 3000 公斤
0.4 4 吨
500 5000 公斤

需求: 将上表中 单位为公斤 的 数量 化成 吨 ,将 单位改为 吨

借方数量 贷方数量 数量单位
0.1 1 吨
0.2 2.0 吨
0.3 3 吨
0.4 4.0 吨
0.5 5 吨

def exec_func(df):
    if df['标准单位'].strip() == '公斤':      # and (df['借方数量'] != 0 or df['贷方数量'] != 0)
        return pd.Series([df['借方数量']/1000, df['贷方数量']/1000, '吨'])
    else:
        return pd.Series([df['借方数量'], df['贷方数量'], '吨'])
df[['借方数量', '贷方数量', '标准单位']] = df.apply(exec_func, axis=1) 
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号