当前位置: 首页 > news >正文

Python Excel 通用筛选函数

案例目的

第一个函数从指定文件路径读取CSV数据并转换为DataFrame,第二个函数使用灵活的条件筛选DataFrame。

示例数据

!+&idxMarketCURRPMTERMANT……
*1JPUSD10
*1CHINAEUR00
*1USAUSD10
*2JPJPY10
*3USACNY11
*4CHINACNY00
*5JPUSD11
*6JPJPY00

假定数据来源是字典

import pandas as pd
import csv
from io import StringIOdef csv_to_dataframe(csv_data=None, file_path=None, delimiter='\t'):"""将CSV数据转换为DataFrame参数:csv_data: CSV格式的字符串数据file_path: CSV文件路径delimiter: 分隔符,默认为制表符返回:pandas DataFrame对象"""if csv_data:# 从字符串读取数据df = pd.read_csv(StringIO(csv_data), delimiter=delimiter)elif file_path:# 从文件读取数据df = pd.read_csv(file_path, delimiter=delimiter)else:raise ValueError("必须提供csv_data或file_path参数")return dfdef filter_dataframe(df, **kwargs):"""根据多列条件筛选DataFrame参数:df: 要筛选的DataFrame**kwargs: 筛选条件,格式为 列名=值 或 列名=[值1, 值2, ...]返回:筛选后的DataFrame"""# 初始化筛选条件condition = pd.Series([True] * len(df))# 处理每个筛选条件for column, values in kwargs.items():if column not in df.columns:raise ValueError(f"列名 '{column}' 不存在于DataFrame中")# 如果值是列表,使用isin方法if isinstance(values, list):condition = condition & df[column].isin(values)# 如果是单个值,使用等号比较else:condition = condition & (df[column] == values)# 应用筛选条件filtered_df = df[condition]return filtered_df# 示例使用
if __name__ == "__main__":# 示例数据csv_data = """!+&	idx	Market	CURR	PM	TERMANT
*	1	JP	USD	1	0
*	1	CHINA	EUD	0	0
*	1	USA	USD	1	0
*	2	JP	JPY	1	0
*	3	USA	CNY	1	1
*	4	CHINA	CNY	0	0
*	5	JP	USD	1	1
*	6	JP	JPY	0	0"""# 使用第一个函数将CSV数据转换为DataFramedf = csv_to_dataframe(csv_data=csv_data, delimiter='\t')print("原始数据:")print(df)print("\n" + "="*50 + "\n")# 示例1: 筛选出Market为JP且CURR为JPY的所有行result1 = filter_dataframe(df, Market='JP', CURR='JPY')print("示例1 - Market为JP且CURR为JPY:")print(result1)print("\n" + "="*50 + "\n")# 示例2: 筛选出Market为日本和美国,CURR为USD和CNYresult2 = filter_dataframe(df, Market=['JP', 'USA'], CURR=['USD', 'CNY'])print("示例2 - Market为JP或USA,CURR为USD或CNY:")print(result2)print("\n" + "="*50 + "\n")# 示例3: 筛选出Market为JP,CURR为USD、CNY和EUDresult3 = filter_dataframe(df, Market='JP', CURR=['USD', 'CNY', 'EUD'])print("示例3 - Market为JP,CURR为USD、CNY或EUD:")print(result3)

这两个函数提供了灵活的筛选功能:

  1. csv_to_dataframe 函数可以从字符串或文件读取CSV数据并转换为DataFrame
  2. filter_dataframe 函数接受任意数量的列筛选条件,每个条件可以是单个值或值列表

优化:通用CSV数据处理函数

import pandas as pd
import csvdef read_csv_to_dataframe(file_path, delimiter='\t', encoding='utf-8'):"""从指定文件路径读取CSV数据并转换为DataFrame参数:file_path: CSV文件的路径delimiter: 分隔符,默认为制表符encoding: 文件编码,默认为utf-8返回:pandas DataFrame对象"""try:# 读取CSV文件df = pd.read_csv(file_path, delimiter=delimiter, encoding=encoding)print(f"成功读取文件: {file_path}")print(f"数据形状: {df.shape}")return dfexcept FileNotFoundError:print(f"错误: 文件 '{file_path}' 不存在")return Noneexcept Exception as e:print(f"读取文件时出错: {str(e)}")return Nonedef filter_dataframe(df, **kwargs):"""根据多列条件筛选DataFrame参数:df: 要筛选的DataFrame**kwargs: 筛选条件,格式为 列名=值 或 列名=[值1, 值2, ...]返回:筛选后的DataFrame"""if df is None or df.empty:print("错误: DataFrame为空或未提供有效数据")return None# 初始化筛选条件condition = pd.Series([True] * len(df))# 处理每个筛选条件for column, values in kwargs.items():if column not in df.columns:print(f"警告: 列名 '{column}' 不存在于DataFrame中,已跳过此条件")continue# 如果值是列表,使用isin方法if isinstance(values, list):condition = condition & df[column].isin(values)# 如果是单个值,使用等号比较else:condition = condition & (df[column] == values)# 应用筛选条件filtered_df = df[condition]print(f"筛选后数据形状: {filtered_df.shape}")return filtered_df# 示例使用
if __name__ == "__main__":# 示例文件路径file_path = "data.csv"# 使用第一个函数读取CSV文件df = read_csv_to_dataframe(file_path)if df is not None:print("\n原始数据前5行:")print(df.head())print("\n" + "="*50 + "\n")# 示例1: 筛选出Market为JP且CURR为JPY的所有行result1 = filter_dataframe(df, Market='JP', CURR='JPY')print("示例1 - Market为JP且CURR为JPY:")print(result1)print("\n" + "="*50 + "\n")# 示例2: 筛选出Market为日本和美国,CURR为USD和CNYresult2 = filter_dataframe(df, Market=['JP', 'USA'], CURR=['USD', 'CNY'])print("示例2 - Market为JP或USA,CURR为USD或CNY:")print(result2)print("\n" + "="*50 + "\n")# 示例3: 筛选出Market为JP,CURR为USD、CNY和EUDresult3 = filter_dataframe(df, Market='JP', CURR=['USD', 'CNY', 'EUD'])print("示例3 - Market为JP,CURR为USD、CNY或EUD:")print(result3)# 可选: 将筛选结果保存到新文件if result1 is not None and not result1.empty:result1.to_csv("filtered_result.csv", index=False, sep='\t')print("筛选结果已保存到 filtered_result.csv")

使用说明

  1. read_csv_to_dataframe 函数:

    • 输入: 文件路径、分隔符(默认为制表符)、编码格式(默认为utf-8)
    • 输出: pandas DataFrame对象
    • 功能: 从指定路径读取CSV文件并转换为DataFrame
  2. filter_dataframe 函数:

    • 输入: DataFrame对象和任意数量的筛选条件
    • 输出: 筛选后的DataFrame
    • 功能: 根据提供的列名和值进行筛选,支持单个值或值列表

使用示例

# 读取CSV文件
df = read_csv_to_dataframe("your_data.csv", delimiter='\t')# 筛选Market为JP且CURR为JPY的行
result = filter_dataframe(df, Market='JP', CURR='JPY')# 筛选Market为JP或USA,且CURR为USD或CNY的行
result = filter_dataframe(df, Market=['JP', 'USA'], CURR=['USD', 'CNY'])# 筛选Market为JP,且CURR为USD、CNY或EUD的行
result = filter_dataframe(df, Market='JP', CURR=['USD', 'CNY', 'EUD'])

注意事项

  1. 请确保文件路径正确,并且有读取权限
  2. 根据实际CSV文件的分隔符调整delimiter参数
  3. 如果文件包含非ASCII字符,可能需要调整encoding参数
  4. 如果列名包含空格或特殊字符,请确保在筛选条件中正确引用
http://www.dtcms.com/a/342182.html

相关文章:

  • 【C++】模板(进阶)
  • Rancher 管理的 K8S 集群中部署常见应用(MySQL、Redis、RabbitMQ)并支持扩缩容的操作
  • ubuntu编译ijkplayer版本k0.8.8(ffmpeg4.0)
  • Spring Boot整合Amazon SNS实战:邮件订阅通知系统开发
  • 将windows 的路径挂载到Ubuntu上进行直接访问
  • C++---辗转相除法
  • VB.NET发送邮件给OUTLOOK.COM的用户,用OUTLOOK.COM邮箱账号登录给别人发邮件
  • Azure的迁移专业服务是怎么提供的
  • 带有 Angular V14 的 Highcharts
  • Transformer在文本、图像和点云数据中的应用——经典工作梳理
  • 【解决方案系列】大规模三维城市场景Web端展示方案
  • C++STL-stack和queue的使用及底层实现
  • 阿里云搭建flask服务器
  • 2021年ASOC SCI2区TOP,改进遗传算法+自主无人机目标覆盖路径规划,深度解析+性能实测
  • Java 16 新特性及具体应用
  • Redis 奇葩问题
  • Python break/continue
  • 嵌入式C语言和数据结构面试题
  • 2025-08-21 Python进阶3——模块
  • 信创自主可控新标杆:RustFS如何用内存安全架构重构数据主权防线?
  • Binlog Server守护MySQL数据0丢失
  • RabbitMQ:技巧汇总
  • Windows下RabbitMQ完整安装指南
  • 云原生俱乐部-k8s知识点归纳(6)
  • 活到老学到老之vue-vben-admin项目添加简单页面
  • 从YOLOv5到RKNN:零冲突转换YOLOv5模型至RK3588 NPU全指南
  • AI创业公司简介:Pogo
  • 三大图计算框架深度对比
  • 机器学习--聚类算法、集成算法
  • 《前端功能开关SDK全景剖析:从远程配置到数据闭环,重构业务迭代底层逻辑》