活动公告

系统通知
05-18 21:22
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

Pandas数据分析实战教程掌握输出大于特定值的数据集技巧与常见问题解决方法

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-2 13:50:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

Pandas是Python中最流行的数据分析库之一,它提供了强大的数据结构和数据分析工具,使数据清洗、转换和分析变得更加高效。在实际数据分析工作中,经常需要筛选出满足特定条件的数据子集,尤其是筛选大于(或小于)特定值的数据。这种操作在数据探索、异常值检测、特征工程等场景中非常常见。

本教程将详细介绍如何使用Pandas筛选大于特定值的数据集,包括基本方法和高级技巧,以及在实际操作中可能遇到的常见问题和解决方法。通过本教程,您将掌握Pandas数据筛选的核心技能,提高数据分析效率。

Pandas基础回顾

在深入探讨筛选技巧之前,让我们简要回顾一下Pandas的基础知识。

Pandas数据结构

Pandas主要有两种数据结构:

1. Series:一维标记数组,能够保存任何数据类型。
2. DataFrame:二维标记数据结构,类似于表格或电子表格。
  1. import pandas as pd
  2. import numpy as np
  3. # 创建Series
  4. s = pd.Series([1, 3, 5, np.nan, 6, 8])
  5. # 创建DataFrame
  6. data = {'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
  7.         'Age': [25, 30, 35, 40, 45],
  8.         'Salary': [50000, 60000, 70000, 80000, 90000]}
  9. df = pd.DataFrame(data)
复制代码

基本操作
  1. # 查看前几行数据
  2. df.head()
  3. # 查看数据基本信息
  4. df.info()
  5. # 查看描述性统计
  6. df.describe()
  7. # 选择列
  8. df['Name']  # 或 df.Name
  9. # 选择行
  10. df.loc[0]  # 通过标签选择
  11. df.iloc[0]  # 通过位置选择
复制代码

筛选大于特定值的数据集的基本方法

使用布尔索引

布尔索引是Pandas中最常用的筛选方法之一。它通过创建一个布尔序列(True/False)来选择满足条件的行。
  1. # 筛选年龄大于30的数据
  2. age_filter = df['Age'] > 30
  3. filtered_df = df[age_filter]
  4. # 或者直接在一行中完成
  5. filtered_df = df[df['Age'] > 30]
  6. print(filtered_df)
复制代码

输出结果:
  1. Name  Age  Salary
  2. 2  Charlie   35   70000
  3. 3    David   40   80000
  4. 4      Eva   45   90000
复制代码

使用query()方法

Pandas的query()方法提供了一种更直观的方式来筛选数据,特别是对于复杂的条件。
  1. # 使用query方法筛选年龄大于30的数据
  2. filtered_df = df.query('Age > 30')
  3. print(filtered_df)
复制代码

输出结果与上面的布尔索引方法相同。

query()方法的优势在于可以更直观地表达复杂的条件:
  1. # 筛选年龄大于30且薪资大于75000的数据
  2. filtered_df = df.query('Age > 30 and Salary > 75000')
  3. print(filtered_df)
复制代码

输出结果:
  1. Name  Age  Salary
  2. 3  David   40   80000
  3. 4    Eva   45   90000
复制代码

使用loc和iloc

loc和iloc是Pandas中用于选择数据的两种方法。loc基于标签索引,而iloc基于整数位置索引。
  1. # 使用loc筛选年龄大于30的数据
  2. filtered_df = df.loc[df['Age'] > 30]
  3. print(filtered_df)
复制代码

loc的优势在于可以同时指定行和列的条件:
  1. # 筛选年龄大于30的数据,并只选择Name和Salary列
  2. filtered_df = df.loc[df['Age'] > 30, ['Name', 'Salary']]
  3. print(filtered_df)
复制代码

输出结果:
  1. Name  Salary
  2. 2  Charlie   70000
  3. 3    David   80000
  4. 4      Eva   90000
复制代码

高级筛选技巧

多条件筛选

在实际数据分析中,经常需要基于多个条件筛选数据。Pandas提供了多种方式来实现多条件筛选。
  1. # 筛选年龄大于30且薪资大于75000的数据
  2. filtered_df = df[(df['Age'] > 30) & (df['Salary'] > 75000)]
  3. print(filtered_df)
复制代码

注意:在Pandas中,使用and、or、not等Python关键字会导致错误,应该使用&(与)、|(或)、~(非)代替。
  1. # 筛选年龄大于30或薪资大于75000的数据
  2. filtered_df = df[(df['Age'] > 30) | (df['Salary'] > 75000)]
  3. print(filtered_df)
复制代码
  1. # 筛选年龄不大于30的数据
  2. filtered_df = df[~(df['Age'] > 30)]
  3. print(filtered_df)
复制代码

基于函数的筛选

有时候,筛选条件可能比较复杂,需要使用函数来实现。Pandas提供了多种基于函数的筛选方法。
  1. # 定义一个筛选函数
  2. def filter_func(row):
  3.     return row['Age'] > 30 and row['Salary'] > 75000
  4. # 使用apply方法应用函数
  5. filtered_df = df[df.apply(filter_func, axis=1)]
  6. print(filtered_df)
复制代码

使用lambda表达式

对于简单的筛选条件,可以使用lambda表达式来简化代码。
  1. # 使用lambda表达式筛选年龄大于30的数据
  2. filtered_df = df[df.apply(lambda row: row['Age'] > 30, axis=1)]
  3. print(filtered_df)
复制代码
  1. # 使用lambda表达式实现多条件筛选
  2. filtered_df = df[df.apply(lambda row: row['Age'] > 30 and row['Salary'] > 75000, axis=1)]
  3. print(filtered_df)
复制代码

使用isin()方法

isin()方法用于筛选值在指定列表中的数据。
  1. # 筛选年龄在[35, 45]之间的数据
  2. filtered_df = df[df['Age'].isin([35, 45])]
  3. print(filtered_df)
复制代码

使用between()方法

between()方法用于筛选值在指定范围内的数据。
  1. # 筛选年龄在30到40之间的数据
  2. filtered_df = df[df['Age'].between(30, 40)]
  3. print(filtered_df)
复制代码

常见问题及解决方法

处理缺失值

在真实数据集中,经常会有缺失值(NaN)。处理缺失值是数据筛选过程中的一个常见问题。
  1. # 创建一个包含缺失值的DataFrame
  2. data = {'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
  3.         'Age': [25, 30, np.nan, 40, 45],
  4.         'Salary': [50000, 60000, 70000, np.nan, 90000]}
  5. df = pd.DataFrame(data)
  6. # 筛选年龄大于30的数据(忽略缺失值)
  7. filtered_df = df[df['Age'] > 30]
  8. print(filtered_df)
复制代码

输出结果:
  1. Name   Age  Salary
  2. 3  David  40.0     NaN
  3. 4    Eva  45.0  90000.0
复制代码

如果要在筛选时考虑缺失值,可以使用notna()或isna()方法:
  1. # 筛选年龄大于30或年龄为缺失值的数据
  2. filtered_df = df[(df['Age'] > 30) | (df['Age'].isna())]
  3. print(filtered_df)
复制代码

输出结果:
  1. Name   Age   Salary
  2. 2  Charlie   NaN  70000.0
  3. 3    David  40.0      NaN
  4. 4      Eva  45.0  90000.0
复制代码

处理不同数据类型

在筛选数据时,可能会遇到不同数据类型的问题,例如字符串和数字的比较。
  1. # 创建一个包含字符串类型年龄的DataFrame
  2. data = {'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
  3.         'Age': ['25', '30', '35', '40', '45'],
  4.         'Salary': [50000, 60000, 70000, 80000, 90000]}
  5. df = pd.DataFrame(data)
  6. # 尝试筛选年龄大于30的数据(会出错)
  7. try:
  8.     filtered_df = df[df['Age'] > 30]
  9. except TypeError as e:
  10.     print(f"Error: {e}")
复制代码

输出结果:
  1. Error: '>' not supported between instances of 'str' and 'int'
复制代码

解决方法是将字符串转换为数字类型:
  1. # 将年龄列转换为数值类型
  2. df['Age'] = pd.to_numeric(df['Age'])
  3. # 现在可以成功筛选年龄大于30的数据
  4. filtered_df = df[df['Age'] > 30]
  5. print(filtered_df)
复制代码

性能优化

当处理大型数据集时,筛选操作可能会变得很慢。以下是一些提高性能的方法:

1. 使用向量化操作:避免使用循环,尽量使用Pandas的向量化操作。
  1. # 不好的做法(使用循环)
  2. filtered_indices = []
  3. for i, age in enumerate(df['Age']):
  4.     if age > 30:
  5.         filtered_indices.append(i)
  6. filtered_df = df.iloc[filtered_indices]
  7. # 好的做法(使用向量化操作)
  8. filtered_df = df[df['Age'] > 30]
复制代码

1. 使用query()方法:对于复杂的条件,query()方法通常比布尔索引更快。
  1. # 使用query方法
  2. filtered_df = df.query('Age > 30')
复制代码

1. 使用eval()方法:对于大型数据集,eval()方法可以提高性能。
  1. # 使用eval方法
  2. filtered_df = df[df.eval('Age > 30')]
复制代码

1. 减少数据复制:避免不必要的数据复制,可以使用inplace参数或视图。
  1. # 不好的做法(创建多个副本)
  2. temp_df = df.copy()
  3. filtered_df = temp_df[temp_df['Age'] > 30]
  4. # 好的做法(直接操作原DataFrame)
  5. filtered_df = df[df['Age'] > 30]
复制代码

处理日期和时间

日期和时间是数据分析中常见的数据类型,筛选日期数据需要特殊处理。
  1. # 创建一个包含日期的DataFrame
  2. data = {'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
  3.         'JoinDate': ['2020-01-01', '2019-05-15', '2021-03-10', '2018-11-20', '2022-02-28'],
  4.         'Salary': [50000, 60000, 70000, 80000, 90000]}
  5. df = pd.DataFrame(data)
  6. # 将JoinDate列转换为日期类型
  7. df['JoinDate'] = pd.to_datetime(df['JoinDate'])
  8. # 筛选2020年1月1日之后入职的员工
  9. filtered_df = df[df['JoinDate'] > '2020-01-01']
  10. print(filtered_df)
复制代码

输出结果:
  1. Name   JoinDate  Salary
  2. 0    Alice 2020-01-01   50000
  3. 2  Charlie 2021-03-10   70000
  4. 4      Eva 2022-02-28   90000
复制代码

处理字符串数据

筛选字符串数据时,可以使用字符串方法。
  1. # 创建一个包含字符串的DataFrame
  2. data = {'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
  3.         'Email': ['alice@example.com', 'bob@gmail.com', 'charlie@yahoo.com', 'david@hotmail.com', 'eva@example.com'],
  4.         'Salary': [50000, 60000, 70000, 80000, 90000]}
  5. df = pd.DataFrame(data)
  6. # 筛选邮箱以'example.com'结尾的数据
  7. filtered_df = df[df['Email'].str.endswith('example.com')]
  8. print(filtered_df)
复制代码

输出结果:
  1. Name              Email  Salary
  2. 0  Alice  alice@example.com   50000
  3. 4    Eva    eva@example.com   90000
复制代码
  1. # 筛选名字包含'a'的数据
  2. filtered_df = df[df['Name'].str.contains('a')]
  3. print(filtered_df)
复制代码

输出结果:
  1. Name              Email  Salary
  2. 0    Alice  alice@example.com   50000
  3. 2  Charlie  charlie@yahoo.com   70000
  4. 3    David  david@hotmail.com   80000
复制代码

实战案例

让我们通过一个更复杂的实战案例来演示如何应用上述技巧。

假设我们有一个销售数据集,包含销售人员的姓名、销售日期、销售额和产品类别。我们的目标是分析销售数据,找出高价值的销售记录。
  1. # 创建销售数据集
  2. np.random.seed(42)
  3. dates = pd.date_range(start='2022-01-01', end='2022-12-31')
  4. names = ['Alice', 'Bob', 'Charlie', 'David', 'Eva']
  5. categories = ['Electronics', 'Clothing', 'Food', 'Books']
  6. # 生成随机销售数据
  7. n_records = 1000
  8. data = {
  9.     'Name': np.random.choice(names, n_records),
  10.     'Date': np.random.choice(dates, n_records),
  11.     'Amount': np.random.randint(100, 10000, n_records),
  12.     'Category': np.random.choice(categories, n_records)
  13. }
  14. sales_df = pd.DataFrame(data)
  15. # 查看前几行数据
  16. print(sales_df.head())
复制代码

输出结果:
  1. Name       Date  Amount     Category
  2. 0  Alice 2022-02-15    4327  Electronics
  3. 1    Eva 2022-11-19    8483       Clothing
  4. 2  David 2022-04-18    5953         Books
  5. 3  David 2022-07-05    1568         Food
  6. 4  Alice 2022-10-30    4353  Electronics
复制代码

分析1:找出销售额大于5000的记录
  1. # 找出销售额大于5000的记录
  2. high_sales = sales_df[sales_df['Amount'] > 5000]
  3. print(f"Number of high-value sales: {len(high_sales)}")
  4. print(f"Percentage of high-value sales: {len(high_sales) / len(sales_df) * 100:.2f}%")
  5. print("\nTop 10 high-value sales:")
  6. print(high_sales.sort_values('Amount', ascending=False).head(10))
复制代码

分析2:找出每个产品类别中销售额大于平均值的记录
  1. # 计算每个产品类别的平均销售额
  2. category_avg = sales_df.groupby('Category')['Amount'].mean()
  3. print("Average sales by category:")
  4. print(category_avg)
  5. # 找出每个产品类别中销售额大于平均值的记录
  6. high_value_by_category = sales_df[sales_df.apply(lambda row: row['Amount'] > category_avg[row['Category']], axis=1)]
  7. print(f"\nNumber of high-value sales by category: {len(high_value_by_category)}")
  8. print(f"Percentage of high-value sales by category: {len(high_value_by_category) / len(sales_df) * 100:.2f}%")
复制代码

分析3:找出每个销售人员在2022年下半年销售额大于上半年平均值的记录
  1. # 将日期转换为月份
  2. sales_df['Month'] = sales_df['Date'].dt.month
  3. # 计算每个销售人员在上半年(1-6月)的平均销售额
  4. first_half_avg = sales_df[sales_df['Month'] <= 6].groupby('Name')['Amount'].mean()
  5. print("First half average sales by salesperson:")
  6. print(first_half_avg)
  7. # 找出每个销售人员在下半年(7-12月)销售额大于上半年平均值的记录
  8. high_value_in_second_half = sales_df[(sales_df['Month'] > 6) &
  9.                                      sales_df.apply(lambda row: row['Amount'] > first_half_avg[row['Name']], axis=1)]
  10. print(f"\nNumber of high-value sales in second half: {len(high_value_in_second_half)}")
  11. print(f"Percentage of high-value sales in second half: {len(high_value_in_second_half) / len(sales_df[sales_df['Month'] > 6]) * 100:.2f}%")
复制代码

分析4:找出销售额大于80百分位的记录
  1. # 计算销售额的80百分位
  2. percentile_80 = sales_df['Amount'].quantile(0.8)
  3. print(f"80th percentile of sales amount: {percentile_80}")
  4. # 找出销售额大于80百分位的记录
  5. top_sales = sales_df[sales_df['Amount'] > percentile_80]
  6. print(f"\nNumber of top sales: {len(top_sales)}")
  7. print(f"Percentage of top sales: {len(top_sales) / len(sales_df) * 100:.2f}%")
  8. print("\nTop sales by category:")
  9. print(top_sales['Category'].value_counts())
复制代码

总结与最佳实践

在本教程中,我们详细介绍了如何使用Pandas筛选大于特定值的数据集,包括基本方法和高级技巧,以及在实际操作中可能遇到的常见问题和解决方法。以下是一些总结和最佳实践:

基本方法总结

1. 布尔索引:最常用的筛选方法,通过创建布尔序列来选择满足条件的行。
2. query()方法:提供了一种更直观的方式来筛选数据,特别是对于复杂的条件。
3. loc和iloc:可以同时指定行和列的条件,更加灵活。

高级技巧总结

1. 多条件筛选:使用&(与)、|(或)、~(非)来组合多个条件。
2. 基于函数的筛选:对于复杂的筛选条件,可以使用函数来实现。
3. 使用lambda表达式:对于简单的筛选条件,可以使用lambda表达式来简化代码。
4. 使用isin()和between()方法:分别用于筛选值在指定列表中和范围内的数据。

常见问题解决方法总结

1. 处理缺失值:使用notna()或isna()方法来处理缺失值。
2. 处理不同数据类型:确保数据类型一致,必要时进行类型转换。
3. 性能优化:使用向量化操作、query()方法、eval()方法等提高性能。
4. 处理日期和时间:将日期字符串转换为日期类型,然后进行比较。
5. 处理字符串数据:使用字符串方法如contains()、endswith()等进行筛选。

最佳实践

1. 选择合适的方法:根据具体需求选择最合适的筛选方法,简单条件使用布尔索引,复杂条件使用query()方法。
2. 注意数据类型:确保比较的数据类型一致,避免类型错误。
3. 处理缺失值:在筛选前考虑如何处理缺失值,是否包含或排除。
4. 优化性能:对于大型数据集,使用性能更高的方法,如query()或eval()。
5. 链式操作:可以将多个筛选操作链接在一起,使代码更加简洁。

通过掌握这些技巧和方法,您将能够更加高效地使用Pandas进行数据分析,特别是在筛选大于特定值的数据集方面。希望本教程对您有所帮助!
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则