赞
踩
继续上一篇数据分析Pandas专栏---第九章<Pandas数据筛选和过滤(1)>-CSDN博客
在Pandas中,我们可以使用逻辑运算符(例如与、或、非等)来组合多个条件,进行复杂的条件筛选。常见的逻辑运算符包括 &
(与)、|
(或)和 ~
(非)。
假设我们有一个包含学生信息的数据集,其中包括姓名、年龄和成绩三列。我们想筛选出年龄大于18岁且成绩大于等于80分的学生。可以使用逻辑运算符进行复杂条件筛选。
- import pandas as pd
-
- # 创建示例数据
- data = {'姓名': ['小明', '小红', '小刚', '小华'],
- '年龄': [18, 20, 19, 21],
- '成绩': [75, 92, 85, 78]}
-
- df = pd.DataFrame(data)
-
- # 使用逻辑运算符进行复杂条件筛选
- filtered_df = df[(df['年龄'] > 18) & (df['成绩'] >= 80)]
-
- print(filtered_df)
运行以上代码,我们将得到年龄大于18岁且成绩大于等于80分的学生数据:
- 姓名 年龄 成绩
- 2 小刚 19 85
在复杂的条件筛选中,有时候我们需要使用括号来明确不同条件之间的优先级。括号可以帮助我们确保不同条件的组合顺序和逻辑正确。
假设我们要筛选年龄大于18岁且(成绩大于等于80或小于70)的学生。我们可以使用括号来组合条件的优先级。
- # 使用括号来组合多个条件的优先级
- filtered_df = df[(df['年龄'] > 18) & ((df['成绩'] >= 80) | (df['成绩'] < 70))]
-
- print(filtered_df)
运行以上代码,我们将得到符合年龄大于18岁且成绩大于等于80或小于70的学生数据:
- 姓名 年龄 成绩
- 0 小明 18 75
通过这个示例,我们可以理解如何使用逻辑运算符和括号来进行复杂条件筛选,确保条件的组合顺序和逻辑正确。
逻辑运算符和括号是在Pandas进行复杂条件筛选时非常有用的工具。通过合理使用它们,我们可以根据不同的需求组合多个条件,灵活应对各种复杂的数据筛选和过滤情况。
在Pandas中,apply()函数用于对DataFrame中的行或列执行自定义操作。它可以帮助我们根据自定义的条件对数据进行灵活的筛选和处理。
DataFrame.apply(func, axis=0)
其中,func是一个自定义函数,用于对行或列进行处理;axis表示操作的方向,0表示对每一列应用函数,1表示对每一行应用函数。
假设我们有一个包含学生信息的数据集,其中包括姓名、年龄和成绩三列。现在我们想筛选出成绩在某个阈值以上的学生。
首先,我们定义一个自定义函数above_threshold()
,该函数接收一个值作为参数,并返回该值是否超过阈值。然后,我们使用apply()函数将该函数应用在成绩列上,并根据返回的结果进行筛选。
- import pandas as pd
-
- # 创建示例数据
- data = {'姓名': ['小明', '小红', '小刚', '小华'],
- '年龄': [18, 20, 19, 21],
- '成绩': [75, 92, 85, 78]}
-
- df = pd.DataFrame(data)
-
- # 定义自定义函数,判断成绩是否超过阈值
- def above_threshold(value, threshold):
- return value >= threshold
-
- # 使用apply()函数进行自定义条件筛选
- threshold = 80
- filtered_df = df[df['成绩'].apply(above_threshold, threshold=threshold)]
-
- print(filtered_df)
运行以上代码,我们将得到成绩在80分以上的学生数据:
- 姓名 年龄 成绩
- 1 小红 20 92
- 2 小刚 19 85
通过上述示例,我们可以看出apply()函数的灵活性。我们可以根据自己的需求,编写自定义函数并将其应用在DataFrame的行或列上,以实现复杂的条件筛选和处理。
使用apply()函数根据自定义条件进行筛选不仅可以实现基本的条件判断,还可以处理更加复杂的情况。例如,我们可以在自定义函数中实现对多列的条件判断,并将筛选结果与其他列进行运算和组合。这种灵活性使得apply()函数成为处理各种数据筛选和自定义操作的有力工具。
在Pandas中,query()函数用于根据表达式条件筛选DataFrame中的数据。它提供了一种简洁、直观的方式来筛选数据,具有以下优势:
简洁直观:使用query()函数,可以使用类似于表达式的语法来编写筛选条件,使代码更加易读和易懂。
更少的中间变量:相比于使用多个中间变量来存储筛选条件,query()函数可以直接在一个语句中完成筛选,并返回筛选结果。
高性能:query()函数使用了一些优化技术,可以在内部进行表达式的解析和求值,从而提高筛选操作的性能。
假设我们有一个包含学生信息的数据集,其中包括姓名、年龄和成绩三列。现在我们想筛选出年龄大于等于20岁且成绩大于等于80分的学生。
- import pandas as pd
-
- # 创建示例数据
- data = {'姓名': ['小明', '小红', '小刚', '小华'],
- '年龄': [18, 20, 19, 21],
- '成绩': [75, 92, 85, 78]}
-
- df = pd.DataFrame(data)
-
- # 使用query()函数进行表达式条件筛选
- filtered_df = df.query('年龄 >= 20 and 成绩 >= 80')
-
- print(filtered_df)
运行以上代码,我们将得到年龄大于等于20岁且成绩大于等于80分的学生数据:
- 姓名 年龄 成绩
- 1 小红 20 92
通过query()函数,我们可以直接在字符串中编写符合条件的表达式,便于理解和维护。query()函数将根据条件表达式自动解析和求值,返回筛选后的结果。
通过这个示例,我们可以看到使用query()函数进行表达式条件筛选的简洁性和直观性。它提供了一种方便而高效的方式,使得我们可以轻松地根据复杂的条件筛选和过滤数据,简化代码并提高效率。
在数据分析中,我们经常需要进行多个条件的筛选操作。使用过滤器链是一种常见且有效的方法,它允许我们按照特定顺序依次应用多个条件来筛选数据。
过滤器链的基本思路是:从原始数据开始,通过多次筛选操作逐步缩小数据范围。每个过滤器步骤都应用一个条件,从而逐渐筛选出符合要求的数据。
假设我们有一个包含学生信息的数据集,其中包括姓名、年龄和成绩三列。我们要筛选出年龄在20岁到25岁之间且成绩高于90分的学生。
可以使用以下技巧来进行多个步骤的筛选:
- import pandas as pd
-
- # 创建示例数据
- data = {'姓名': ['小明', '小红', '小刚', '小华'],
- '年龄': [18, 22, 19, 25],
- '成绩': [75, 92, 85, 98]}
-
- df = pd.DataFrame(data)
-
- # 使用过滤器链进行多步骤筛选
- filtered_df = df[df['年龄'].between(20, 25)][df['成绩'] > 90]
-
- print(filtered_df)
运行以上代码,我们将得到年龄在20岁到25岁之间且成绩高于90分的学生数据:
- 姓名 年龄 成绩
- 1 小红 22 92
- 3 小华 25 98
通过示例代码,我们可以看到通过过滤器链的方式,我们可以逐步筛选数据,按照特定顺序应用多个条件。这种技巧可以帮助我们灵活地处理多个条件,以得到符合要求的数据集。通过合理构建过滤器链,我们可以快速、高效地从原始数据中提取出我们需要的数据。
在数据分析和处理过程中,我们常常面临性能优化的挑战。通过优化筛选和过滤操作,我们可以提高代码执行效率,并减少内存占用。一些性能优化和使用技巧,包括避免复制数据、使用适当的数据类型、利用索引和排序以及在大数据集上并行化操作。
在处理大型数据集时,复制数据可能导致性能下降和内存占用增加。因此,尽量避免复制数据,可以通过以下方式来实现:
使用视图或切片:使用视图或切片来引用原始数据,而不是创建副本。这样可以避免复制大量的数据,并节省内存。
原地操作:在可能的情况下,尽量在原始数据上进行原地操作,而不是创建新的数据结构。这样可以避免重复的复制操作。
选择适当的数据类型可以显著降低内存占用,提高性能。以下是一些常用的优化技巧:
使用整数或布尔类型:当数据范围较小时,使用整数或布尔类型来表示数据,可以节省大量的内存空间。
使用类别类型:对于具有有限取值的列,如性别、国家等,可以将其数据类型设置为类别类型。这种优化可以大大减少内存使用。
使用索引和排序可以加快筛选和过滤操作的速度。下面是一些技巧:
创建索引:对于经常被用于筛选和过滤操作的列,可以创建索引来加速数据检索。这将减少搜索时间,并提高执行效率。
对数据进行排序:在筛选和过滤之前,先对数据进行排序。这样可以通过二分查找等算法更快地检索和访问数据。
在处理大型数据集时,通过并行化操作可以显著提高性能。以下是一些并行化技巧:
使用并行化库:利用现有的并行化库,如multiprocessing
、dask
或pyspark
,将筛选和过滤操作分解成多个任务,并并行执行。
分片和并行处理:将大数据集分成多个小片段,然后在每个片段上并行化执行筛选和过滤操作。最后将结果合并。
在数据处理过程中,性能优化和使用技巧是非常重要的。通过避免数据复制、使用适当的数据类型、利用索引和排序以及在大数据集上并行化操作,我们可以提高代码执行效率,并减少内存占用。这些技巧可以帮助我们更有效地处理和分析大规模数据,提升数据分析的效率和准确性。
使用布尔索引: 使用布尔表达式进行筛选和过滤是Pandas的一大特点。可以使用比较运算符(例如==
, !=
, >
, <
)和逻辑运算符(例如&
, |
, ~
)来创建布尔条件。
使用.loc
进行基于标签的筛选: 使用.loc
属性,可以利用行和列的标签进行筛选操作。例如,df.loc[row_condition, column_condition]
可以选择满足行和列条件的数据。
使用.iloc
进行基于位置的筛选: 使用.iloc
属性,可以按照索引的位置进行筛选操作。例如,df.iloc[row_index, column_index]
可以选择满足行和列索引的数据。
使用.query()
方法进行基于表达式的筛选: .query()
方法允许使用表达式和变量来筛选DataFrame。这提供了一种更直观和灵活的方式来进行筛选操作。
使用条件组合进行复杂筛选: 可以使用括号来组合多个条件,在布尔索引中使用逻辑运算符(例如&
和|
)来构建复杂的筛选条件。
使用isin()
进行成员资格测试: isin()
方法可以用于判断某个列的值是否在指定的列表中,从而进行成员资格测试。
使用between()
进行范围筛选:between()
方法可以用于筛选出满足某个范围条件的数据,例如某列的数值在指定的范围内。
使用正则表达式进行模式匹配筛选:可以使用str.contains()
方法结合正则表达式,对字符串进行模式匹配筛选操作。
在实际工作中,以下是一些经验和建议可以帮助提高数据筛选和过滤的效率和准确性:
确保数据准确性: 在进行筛选和过滤之前,务必检查和清理数据,确保数据的准确性和一致性。处理缺失值、处理异常值,以及进行数据类型转换,都是关键的前提步骤。
选择正确的筛选技巧: 在进行数据筛选和过滤时,选择适当的技巧可以提高效率。根据具体需求,选择基于标签、基于位置、基于表达式或基于其他条件的筛选方法,以便快速得到需要的结果。
利用向量化操作: 利用Pandas的向量化操作,可以在底层使用高效的C语言实现,提高运行速度。尽量避免使用循环和迭代,而是使用矢量化的方式处理数据。
持续学习和探索新功能: Pandas是一个功能强大且不断进化的库,持续深入学习和探索新功能可以帮助提高工作效率。阅读官方文档、参考教程和案例,以及参与社区讨论,都是获取新知识的重要途径。
优化性能: 对于大型数据集和复杂操作,性能优化是关键。使用适当的数据结构、避免不必要的复制、利用索引和排序等技巧,可以显著提高代码执行效率。
测试和验证: 在进行筛选和过滤操作时,务必进行测试和验证。确保筛选条件正确,并且所得到的结果符合预期。反复迭代和验证可以帮助发现可能存在的问题和错误。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。