Python Excel 通用篩選函數(shù)的實現(xiàn)
案例目的
第一個函數(shù)從指定文件路徑讀取CSV數(shù)據(jù)并轉(zhuǎn)換為DataFrame,第二個函數(shù)使用靈活的條件篩選DataFrame。
示例數(shù)據(jù)
!+& | 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 | … |
假定數(shù)據(jù)來源是字典
import pandas as pd import csv from io import StringIO def csv_to_dataframe(csv_data=None, file_path=None, delimiter='\t'): """ 將CSV數(shù)據(jù)轉(zhuǎn)換為DataFrame 參數(shù): csv_data: CSV格式的字符串?dāng)?shù)據(jù) file_path: CSV文件路徑 delimiter: 分隔符,默認(rèn)為制表符 返回: pandas DataFrame對象 """ if csv_data: # 從字符串讀取數(shù)據(jù) df = pd.read_csv(StringIO(csv_data), delimiter=delimiter) elif file_path: # 從文件讀取數(shù)據(jù) df = pd.read_csv(file_path, delimiter=delimiter) else: raise ValueError("必須提供csv_data或file_path參數(shù)") return df def filter_dataframe(df, **kwargs): """ 根據(jù)多列條件篩選DataFrame 參數(shù): 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) # 應(yīng)用篩選條件 filtered_df = df[condition] return filtered_df # 示例使用 if __name__ == "__main__": # 示例數(shù)據(jù) 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""" # 使用第一個函數(shù)將CSV數(shù)據(jù)轉(zhuǎn)換為DataFrame df = csv_to_dataframe(csv_data=csv_data, delimiter='\t') print("原始數(shù)據(jù):") 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)
這兩個函數(shù)提供了靈活的篩選功能:
csv_to_dataframe
函數(shù)可以從字符串或文件讀取CSV數(shù)據(jù)并轉(zhuǎn)換為DataFramefilter_dataframe
函數(shù)接受任意數(shù)量的列篩選條件,每個條件可以是單個值或值列表
優(yōu)化:通用CSV數(shù)據(jù)處理函數(shù)
import pandas as pd import csv def read_csv_to_dataframe(file_path, delimiter='\t', encoding='utf-8'): """ 從指定文件路徑讀取CSV數(shù)據(jù)并轉(zhuǎn)換為DataFrame 參數(shù): file_path: CSV文件的路徑 delimiter: 分隔符,默認(rèn)為制表符 encoding: 文件編碼,默認(rèn)為utf-8 返回: pandas DataFrame對象 """ try: # 讀取CSV文件 df = pd.read_csv(file_path, delimiter=delimiter, encoding=encoding) print(f"成功讀取文件: {file_path}") print(f"數(shù)據(jù)形狀: {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): """ 根據(jù)多列條件篩選DataFrame 參數(shù): df: 要篩選的DataFrame **kwargs: 篩選條件,格式為 列名=值 或 列名=[值1, 值2, ...] 返回: 篩選后的DataFrame """ if df is None or df.empty: print("錯誤: DataFrame為空或未提供有效數(shù)據(jù)") 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) # 應(yīng)用篩選條件 filtered_df = df[condition] print(f"篩選后數(shù)據(jù)形狀: {filtered_df.shape}") return filtered_df # 示例使用 if __name__ == "__main__": # 示例文件路徑 file_path = "data.csv" # 使用第一個函數(shù)讀取CSV文件 df = read_csv_to_dataframe(file_path) if df is not None: print("\n原始數(shù)據(jù)前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) # 可選: 將篩選結(jié)果保存到新文件 if result1 is not None and not result1.empty: result1.to_csv("filtered_result.csv", index=False, sep='\t') print("篩選結(jié)果已保存到 filtered_result.csv")
使用說明
read_csv_to_dataframe 函數(shù):
- 輸入: 文件路徑、分隔符(默認(rèn)為制表符)、編碼格式(默認(rèn)為utf-8)
- 輸出: pandas DataFrame對象
- 功能: 從指定路徑讀取CSV文件并轉(zhuǎn)換為DataFrame
filter_dataframe 函數(shù):
- 輸入: DataFrame對象和任意數(shù)量的篩選條件
- 輸出: 篩選后的DataFrame
- 功能: 根據(jù)提供的列名和值進(jìn)行篩選,支持單個值或值列表
使用示例
# 讀取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'])
注意事項
- 請確保文件路徑正確,并且有讀取權(quán)限
- 根據(jù)實際CSV文件的分隔符調(diào)整
delimiter
參數(shù) - 如果文件包含非ASCII字符,可能需要調(diào)整
encoding
參數(shù) - 如果列名包含空格或特殊字符,請確保在篩選條件中正確引用
到此這篇關(guān)于Python Excel 通用篩選函數(shù)的實現(xiàn)的文章就介紹到這了,更多相關(guān)Python Excel篩選函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Flask 讓jsonify返回的json串支持中文顯示的方法
下面小編就為大家分享一篇Flask 讓jsonify返回的json串支持中文顯示的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03Python實現(xiàn)中文數(shù)字轉(zhuǎn)換為阿拉伯?dāng)?shù)字的方法示例
這篇文章主要介紹了Python實現(xiàn)中文數(shù)字轉(zhuǎn)換為阿拉伯?dāng)?shù)字的方法,涉及Python字符串遍歷、轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2017-05-05Python使用melt和pivot實現(xiàn)DataFrame格式轉(zhuǎn)換
在數(shù)據(jù)處理與分析中,經(jīng)常遇到數(shù)據(jù)需要進(jìn)行格式轉(zhuǎn)換的情況,例如將數(shù)據(jù)從寬表格式轉(zhuǎn)換為長表格式,或?qū)?shù)據(jù)重新分組匯總,Pandas提供了豐富的reshape操作,尤其是melt和pivot這兩個函數(shù),使得DataFrame可以在寬表與長表之間高效轉(zhuǎn)換,本文介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01解決Python 函數(shù)聲明先后順序出現(xiàn)的問題
這篇文章主要介紹了如何解決Python 函數(shù)聲明先后順序的問題,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2020-09-09解決Tensorflow2.0 tf.keras.Model.load_weights() 報錯處理問題
這篇文章主要介紹了解決Tensorflow2.0 tf.keras.Model.load_weights() 報錯處理問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨想過來看看吧2020-06-06