本文目录导读:

我来为你详细介绍Pandas数据过滤的各种方法和示例:
基础过滤函数
单条件过滤
import pandas as pd
import numpy as np
# 创建示例数据
df = pd.DataFrame({
'name': ['张三', '李四', '王五', '赵六', '孙七'],
'age': [25, 30, 35, 28, 32],
'salary': [8000, 12000, 15000, 10000, 9000],
'department': ['技术', '市场', '技术', '财务', '市场'],
'city': ['北京', '上海', '北京', '广州', '北京']
})
print("原始数据:")
print(df)
print()
# 1. 过滤年龄大于30的员工
def filter_by_age(df, min_age):
return df[df['age'] > min_age]
print("年龄大于30的员工:")
print(filter_by_age(df, 30))
print()
# 2. 过滤薪资在某个范围
def filter_by_salary_range(df, min_salary, max_salary):
return df[(df['salary'] >= min_salary) & (df['salary'] <= max_salary)]
print("薪资在10000-15000之间的员工:")
print(filter_by_salary_range(df, 10000, 15000))
多条件组合过滤
# 3. 多条件组合过滤函数
def multiple_condition_filter(df, conditions):
"""
多条件过滤
conditions: dict格式的条件
{'department': '技术', 'age_gt': 30}
"""
filtered = df.copy()
for key, value in conditions.items():
if key.endswith('_gt'): # 大于
col = key[:-3]
filtered = filtered[filtered[col] > value]
elif key.endswith('_lt'): # 小于
col = key[:-3]
filtered = filtered[filtered[col] < value]
elif key.endswith('_gte'): # 大于等于
col = key[:-4]
filtered = filtered[filtered[col] >= value]
elif key.endswith('_lte'): # 小于等于
col = key[:-4]
filtered = filtered[filtered[col] <= value]
elif key.endswith('_in'): # 包含列表
col = key[:-3]
filtered = filtered[filtered[col].isin(value)]
else: # 精确匹配
filtered = filtered[filtered[key] == value]
return filtered
# 使用示例
conditions = {
'department': '技术',
'salary_gt': 8000,
'age_lte': 35
}
print("多条件过滤结果:")
print(multiple_condition_filter(df, conditions))
使用query方法过滤
# 4. 使用query方法
def filter_with_query(df, query_string):
"""
使用query方法进行过滤
query_string: 如 'age > 30 and salary > 10000'
"""
return df.query(query_string)
print("使用query过滤 (年龄>25 且 部门='技术'):")
result = filter_with_query(df, "age > 25 and department == '技术'")
print(result)
基于字符串匹配的过滤
# 5. 字符串模糊匹配过滤
def filter_by_string_pattern(df, column, pattern, method='contains'):
"""
method: 'contains'(包含), 'startswith'(以...开头), 'endswith'(以...
'regex'(正则表达式)
"""
if method == 'contains':
return df[df[column].str.contains(pattern, na=False)]
elif method == 'startswith':
return df[df[column].str.startswith(pattern)]
elif method == 'endswith':
return df[df[column].str.endswith(pattern)]
elif method == 'regex':
return df[df[column].str.match(pattern)]
print("城市包含'北'的员工:")
print(filter_by_string_pattern(df, 'city', '北'))
高级过滤函数
# 6. 通用过滤函数
def advanced_data_filter(df, filter_config):
"""
高级数据过滤函数
filter_config: [
{'column': 'age', 'operator': '>', 'value': 30, 'logic': 'and'},
{'column': 'department', 'operator': '==', 'value': '技术', 'logic': 'and'},
{'column': 'salary', 'operator': 'between', 'value': [10000, 20000], 'logic': 'or'}
]
"""
conditions = []
for config in filter_config:
col = config['column']
op = config['operator']
val = config['value']
if op == '>':
condition = df[col] > val
elif op == '<':
condition = df[col] < val
elif op == '>=':
condition = df[col] >= val
elif op == '<=':
condition = df[col] <= val
elif op == '==':
condition = df[col] == val
elif op == '!=':
condition = df[col] != val
elif op == 'in':
condition = df[col].isin(val)
elif op == 'between':
condition = (df[col] >= val[0]) & (df[col] <= val[1])
elif op == 'contains':
condition = df[col].str.contains(val, na=False)
else:
raise ValueError(f"不支持的运算符: {op}")
conditions.append(condition)
# 组合条件
if not conditions:
return df
combined_condition = conditions[0]
for i, condition in enumerate(conditions[1:], 1):
logic = filter_config[i].get('logic', 'and')
if logic == 'and':
combined_condition = combined_condition & condition
elif logic == 'or':
combined_condition = combined_condition | condition
return df[combined_condition]
# 使用示例
filter_config = [
{'column': 'age', 'operator': '>=', 'value': 25, 'logic': 'and'},
{'column': 'salary', 'operator': 'between', 'value': [8000, 15000], 'logic': 'and'},
{'column': 'department', 'operator': 'in', 'value': ['技术', '市场'], 'logic': 'and'}
]
result = advanced_data_filter(df, filter_config)
print("高级过滤结果:")
print(result)
实际应用案例
# 7. 数据分析中的实际应用
# 创建更复杂的数据集
sales_data = pd.DataFrame({
'date': pd.date_range('2023-01-01', periods=100),
'product': np.random.choice(['A', 'B', 'C'], 100),
'sales': np.random.randint(100, 1000, 100),
'quantity': np.random.randint(1, 20, 100),
'region': np.random.choice(['华东', '华南', '华北'], 100)
})
def analyze_sales_by_region(df, region, min_sales=500):
"""
分析特定区域的销售数据
"""
# 过滤数据
filtered = df[
(df['region'] == region) &
(df['sales'] > min_sales)
]
# 返回统计信息
return {
'total_sales': filtered['sales'].sum(),
'avg_sales': filtered['sales'].mean(),
'total_quantity': filtered['quantity'].sum(),
'product_distribution': filtered['product'].value_counts()
}
# 使用案例
result = analyze_sales_by_region(sales_data, '华东', min_sales=300)
print(f"华东区销售分析:")
print(f"总销售额: {result['total_sales']}")
print(f"平均销售额: {result['avg_sales']:.2f}")
print(f"总销量: {result['total_quantity']}")
print("产品销售分布:")
print(result['product_distribution'])
性能优化建议
# 8. 大数据量时的优化过滤
def optimized_filter(df, conditions):
"""
大数据量时的优化过滤
"""
# 使用布尔索引而不是loc
mask = pd.Series(True, index=df.index)
for col, op, val in conditions:
if op == '==':
mask &= (df[col] == val)
elif op == '>':
mask &= (df[col] > val)
# ... 其他运算符
return df[mask]
# 使用numpy条件加速
def numpy_optimized_filter(df, column, threshold):
"""
使用numpy加速过滤
"""
values = df[column].values # 转换为numpy数组
mask = values > threshold
return df[mask]
使用建议
-
选择合适的方法:
- 简单条件
.loc或 - 复杂条件用
query() - 动态条件用函数封装
- 简单条件
-
性能考虑:
- 大数据量使用
.loc - 避免链式索引
- 使用
isin()替代多个
- 大数据量使用
-
代码可维护性:
- 将过滤逻辑封装成函数
- 使用配置化的方式定义过滤规则
- 添加适当的注释和文档
这些示例覆盖了Pandas数据过滤的主要场景,你可以根据实际需求选择合适的实现方式。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播