PythonExcel通用筛选函数的实现

Written by

in

文章目录
  • 第一个函数从指定文件路径读取CSV数据并转换为DataFrame,第二个函数使用灵活的条件筛选DataFrame。
  • !+& idx Market CURR PM TERMANT …… * 1 JP USD 1 0 … * 1 CHINA EUR 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 …
  • 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) 这两个函数提供了灵活的筛选功能: csv_to_dataframe 函数可以从字符串或文件读取CSV数据并转换为DataFrame filter_dataframe 函数接受任意数量的列筛选条件,每个条件可以是单个值或值列表
  • 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”)
  • 目录
    • 案例目的
    • 示例数据
    • 假定数据来源是字典
    • 优化:通用CSV数据处理函数
      • 使用说明
      • 使用示例
      • 注意事项

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

    !+& idx Market CURR PM TERMANT ……
    * 1 JP USD 1 0
    * 1 CHINA EUR 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

    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 函数接受任意数量的列筛选条件,每个条件可以是单个值或值列表

    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筛选函数内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 

    您可能感兴趣的文章:

    • Python Pandas读取Excel数据并根据时间字段筛选数据
    • Python实现多条件筛选Excel数据并批量绘制直方图
    • Python实现指定范围内筛选并剔除Excel表格中的数据
    • 如何利用Python让Excel快速按条件筛选数据
    • 利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)
    • Python对Excel按列值筛选并拆分表格到多个文件的代码

    站内搜索