Python Excel 通用筛选函数的实现

 更新时间:2025年08月22日 09:20:32   作者:偷心伊普西隆  
本文主要介绍了Python Excel 通用筛选函数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

案例目的

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

示例数据

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

假定数据来源是字典

import pandas as pd
import csv
from io import StringIO

def 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 df

def 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数据转换为DataFrame
    df = 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和CNY
    result2 = 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和EUD
    result3 = 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 csv

def 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 df
    except FileNotFoundError:
        print(f"错误: 文件 '{file_path}' 不存在")
        return None
    except Exception as e:
        print(f"读取文件时出错: {str(e)}")
        return None

def 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和CNY
        result2 = 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和EUD
        result3 = 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. 如果列名包含空格或特殊字符,请确保在筛选条件中正确引用

到此这篇关于Python Excel 通用筛选函数的实现的文章就介绍到这了,更多相关Python Excel筛选函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Flask 让jsonify返回的json串支持中文显示的方法

    Flask 让jsonify返回的json串支持中文显示的方法

    下面小编就为大家分享一篇Flask 让jsonify返回的json串支持中文显示的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • python实现稀疏矩阵示例代码

    python实现稀疏矩阵示例代码

    本篇文章主要介绍了python实现稀疏矩阵示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Python实现中文数字转换为阿拉伯数字的方法示例

    Python实现中文数字转换为阿拉伯数字的方法示例

    这篇文章主要介绍了Python实现中文数字转换为阿拉伯数字的方法,涉及Python字符串遍历、转换相关操作技巧,需要的朋友可以参考下
    2017-05-05
  • django 控制页面跳转的例子

    django 控制页面跳转的例子

    今天小编就为大家分享一篇django 控制页面跳转的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Python使用melt和pivot实现DataFrame格式转换

    Python使用melt和pivot实现DataFrame格式转换

    在数据处理与分析中,经常遇到数据需要进行格式转换的情况,例如将数据从宽表格式转换为长表格式,或将数据重新分组汇总,Pandas提供了丰富的reshape操作,尤其是melt和pivot这两个函数,使得DataFrame可以在宽表与长表之间高效转换,本文介绍的非常详细,需要的朋友可以参考下
    2025-01-01
  • 解决Python 函数声明先后顺序出现的问题

    解决Python 函数声明先后顺序出现的问题

    这篇文章主要介绍了如何解决Python 函数声明先后顺序的问题,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-09-09
  • python查看zip包中文件及大小的方法

    python查看zip包中文件及大小的方法

    这篇文章主要介绍了python查看zip包中文件及大小的方法,实例分析了Python基于zipfile模块操作zip压缩文件的相关技巧,非常简单实用,需要的朋友可以参考下
    2015-07-07
  • 解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题

    解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题

    这篇文章主要介绍了解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题,具有很好的参考价值,希望对大家有所帮助。一起跟随想过来看看吧
    2020-06-06
  • pytorch中常用的损失函数用法说明

    pytorch中常用的损失函数用法说明

    这篇文章主要介绍了pytorch中常用的损失函数用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • Python tkinter模版代码实例

    Python tkinter模版代码实例

    这篇文章主要介绍了Python tkinter模版代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02

最新评论