pandas学习之索引

感想

近期,公司业务繁忙,学习时间受限,只能插空看教材,然后有时间再把自己不会的知识点,用Notebook演练一把。有人会说,上班没时间可以周末呀,我们公司是单休,有时还要在周日加班整理下周周一开会需要的资料。

本周的知识点,看了两遍,习题无法全部完成,本次分享我的一些想法及个别题目的解题内容。

1、索引
索引是python中最重要的工具,会有很多索引方法,我们并不一定要全部完全掌握,但我们一定要熟练掌握其中2-3种,如loc和iloc,只有专精才能全通。
一般地,单层索引用起来方便舒适;平时使用习惯使用reset_index把多层索引转换为单层索引。
那什么情形下,会产生多层索引?主要是使用聚合类方法或函数时,比如groupby、pivot或pivot_table。

	练一练:
	select_dtypes 是一个实用函数,它能够从表中选出相应类型的列,若要选出所有数值型的列,只需使用 .select_dtypes('number') ,请利用布尔列表选择的方法结合 DataFrame 的 dtypes 属性在 learn_pandas 数据集上实现这个功能。

答案:df.select_dtypes('number')

参考资料:https://datawhalechina.github.io/joyful-pandas/build/html/%E7%9B%AE%E5%BD%95/ch3.html#id6

<think>好的,我需要帮助用户了解如何使用Pandas进行布尔型索引过滤。首先,根据用户的问题,我应该先回顾一下布尔索引的基本概念和步骤。用户提到了教程,所以我需要确保回答结构清晰,分步骤说明。 首先,布尔索引的核心是创建布尔掩码。我记得布尔掩码是一个由True和False组成的Series或数组,对应DataFrame中的每一行是否满足条件。比如,用户想筛选出工资大于60K的数据,就需要生成一个这样的掩码。这里需要注意比较运算符的使用,比如'>',而且可能需要处理数据类型的问题,比如确保'salary'列是数值类型而不是字符串,否则比较可能会出错。不过用户提供的例子中用了字符串'60K',这可能是个例子,实际应用中可能需要先将列转换为数值类型,比如用replace或者正则表达式处理。不过根据引用[2]中的示例,用户可能只是用字符串作为示例,所以暂时按照示例来,但可能需要提醒用户注意数据类型。 接下来,应用布尔掩码到DataFrame上,使用df[boolean_mask]来过滤行。这里要强调逻辑运算符的正确使用,比如&、|、~,并且需要用括号来确保运算顺序,避免运算符优先级的问题。比如,当有多个条件时,每个条件都需要用括号括起来,否则会出错。例如(df['salary'] > '60K') & (df['department'] == 'Sales'),如果不加括号,Python可能会先计算'60K' & df['department'],导致错误。 然后,用户可能需要处理多个条件组合的情况,这时候需要使用逻辑运算符,并且要注意位运算符和逻辑运算符的区别。在Pandas中,必须使用位运算符&、|、~,而不是and、or、not,因为后者是针对单个布尔值的,而位运算符可以处理Series中的每个元素。这一点需要特别强调,避免用户混淆。 另外,用户可能会遇到需要处理缺失值的情况,比如在布尔索引中,NaN值如何处理。可以使用df['column'].notna()来排除缺失值,或者结合其他条件来过滤。但用户的问题中可能暂时不需要涉及缺失值处理,不过作为教程的一部分,可能需要简要提及。 接下来,根据引用[2]中的例子,用户给出了一个使用布尔掩码的示例,其中将salary与'60K'比较。但实际中,如果salary是字符串类型如'60K',可能需要提取数值部分进行比较。比如,先将'salary'列转换为数值,使用str.replace('K', '').astype(int) * 1000,这样比较起来更准确。不过这可能超出布尔索引本身的范围,属于数据预处理的步骤。是否需要提到这一点呢?可能作为最佳实践或注意事项,提醒用户确保数据类型正确,否则比较可能不会按预期工作。 然后,我需要提供示例代码,确保符合用户的要求。根据用户提供的引用,示例代码应该使用正确的语法,比如df[df['salary'] > '60K']。同时,可能还需要展示多个条件的组合,比如同时满足工资大于60K且部门为销售的情况,或者使用OR条件的情况。 此外,用户可能需要知道如何否定条件,即使用~运算符来选择不满足条件的行。例如,df[~(df['department'] == 'HR')]会筛选出部门不是HR的行。 最后,可能需要提及一些常见的错误和解决方法,比如多个条件不加括号导致的错误,或者使用and/or而不是&/|的问题。同时,引用相关的参考资料,如引用[2]中的示例,以及引用[3]中的学习资料链接,帮助用户进一步学习。 总结回答的结构应该是: 1. 布尔索引的基本概念:创建布尔掩码,应用掩码过滤行。 2. 单条件过滤示例。 3. 多条件组合(与、或、非)的使用方法及注意事项。 4. 常见问题及解决方法(如数据类型、运算符优先级、处理缺失值)。 5. 示例代码演示。 6. 参考资料推荐。 现在需要检查是否有遗漏的点,比如isin()方法、query()方法,但用户的问题集中在布尔索引,可能不需要涉及其他方法。但如果有相关的高级技巧,也可以简要提及,比如使用isin()生成布尔掩码。 另外,需要确保所有行内数学表达式使用$...$格式,但在这个问题中可能不涉及数学公式,更多的是代码和逻辑操作。但如果有涉及,比如数据分布的描述,可能需要用LaTeX,比如平均值$\mu$等,但这里可能不需要。 最后,生成相关问题,参考用户提供的示例,问题应该围绕布尔索引的扩展,如多条件处理、性能优化、与其他方法的比较等。</think>### 使用Pandas进行布尔型索引过滤的教程 #### 1. 基本概念 **布尔索引**是通过布尔值(`True`/`False`)构成的掩码(Mask)筛选数据的方法。其核心步骤为: - **生成布尔掩码**:通过比较运算符(如`>`、`==`)或逻辑运算符(`&`、`|`、`~`)生成布尔序列。 - **应用掩码**:将布尔序列传递给DataFrame的行索引器`df[boolean_mask]`,仅保留`True`对应的行。 #### 2. 单条件过滤示例 假设DataFrame包含薪资列`salary`,筛选薪资大于60K的行: ```python import pandas as pd # 示例数据 df = pd.DataFrame({'salary': ['50K', '65K', '70K', '55K'], 'department': ['HR', 'Sales', 'IT', 'Finance']}) # 布尔索引过滤 filtered_df = df[df['salary'] > '60K'] # 注意:此处按字符串比较,实际需转换为数值 print(filtered_df) ``` 输出: ``` salary department 1 65K Sales 2 70K IT ``` > **注意**:若`salary`为字符串(如`'60K'`),直接比较可能不准确。建议转换为数值: > ```python > df['salary_num'] = df['salary'].str.replace('K', '').astype(int) * 1000 > filtered_df = df[df['salary_num'] > 60000] > ``` #### 3. 多条件组合 使用逻辑运算符时,**每个条件需用括号包裹**以避免优先级错误: ```python # 筛选薪资>60K且部门为Sales的行 filtered_df = df[(df['salary'] > '60K') & (df['department'] == 'Sales')] # 筛选薪资>60K或部门为IT的行 filtered_df = df[(df['salary'] > '60K') | (df['department'] == 'IT')] # 排除部门为HR的行 filtered_df = df[~(df['department'] == 'HR')] ``` #### 4. 常见问题与解决 - **错误:`&`与`and`混淆** Python的`and`、`or`不能用于Series,必须使用`&`、`|`,且每个条件需用括号分隔。 - **处理缺失值** 结合`notna()`过滤缺失值: ```python filtered_df = df[(df['salary'] > '60K') & df['department'].notna()] ``` - **优化性能** 对大型数据集,优先使用向量化操作,避免逐行循环[^2]。 #### 5. 扩展方法 - **`isin()`方法**:筛选列值属于某个集合的行 ```python filtered_df = df[df['department'].isin(['Sales', 'IT'])] ``` - **`query()`方法**:用字符串表达式简化复杂条件 ```python filtered_df = df.query("salary > '60K' and department == 'Sales'") ``` #### 6. 学习资源推荐 - Pandas官方教程:[链接](https://bitbucket.org/hrojas/learn-pandas)[^3] - 布尔索引实践案例:[引用示例](https://bitbucket.org/hrojas/learn-pandas) ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值