当前位置: 代码网 > it编程>前端脚本>Python > Python Excel 通用筛选函数的实现

Python Excel 通用筛选函数的实现

2025年09月21日 Python 我要评论
案例目的第一个函数从指定文件路径读取csv数据并转换为dataframe,第二个函数使用灵活的条件筛选dataframe。示例数据!+&idxmarketcurrpmtermant&helli

案例目的

第一个函数从指定文件路径读取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筛选函数内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网! 

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com