Python Excel 通用篩選函數(shù)的實(shí)現(xiàn)
案例目的
第一個(gè)函數(shù)從指定文件路徑讀取CSV數(shù)據(jù)并轉(zhuǎn)換為DataFrame,第二個(gè)函數(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ù)來(lái)源是字典
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對(duì)象
"""
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))
# 處理每個(gè)篩選條件
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)
# 如果是單個(gè)值,使用等號(hào)比較
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"""
# 使用第一個(gè)函數(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為日本和美國(guó),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)
這兩個(gè)函數(shù)提供了靈活的篩選功能:
csv_to_dataframe函數(shù)可以從字符串或文件讀取CSV數(shù)據(jù)并轉(zhuǎn)換為DataFramefilter_dataframe函數(shù)接受任意數(shù)量的列篩選條件,每個(gè)條件可以是單個(gè)值或值列表
優(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對(duì)象
"""
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"錯(cuò)誤: 文件 '{file_path}' 不存在")
return None
except Exception as e:
print(f"讀取文件時(shí)出錯(cuò): {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("錯(cuò)誤: DataFrame為空或未提供有效數(shù)據(jù)")
return None
# 初始化篩選條件
condition = pd.Series([True] * len(df))
# 處理每個(gè)篩選條件
for column, values in kwargs.items():
if column not in df.columns:
print(f"警告: 列名 '{column}' 不存在于DataFrame中,已跳過(guò)此條件")
continue
# 如果值是列表,使用isin方法
if isinstance(values, list):
condition = condition & df[column].isin(values)
# 如果是單個(gè)值,使用等號(hào)比較
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"
# 使用第一個(gè)函數(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為日本和美國(guó),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")
使用說(shuō)明
read_csv_to_dataframe 函數(shù):
- 輸入: 文件路徑、分隔符(默認(rèn)為制表符)、編碼格式(默認(rèn)為utf-8)
- 輸出: pandas DataFrame對(duì)象
- 功能: 從指定路徑讀取CSV文件并轉(zhuǎn)換為DataFrame
filter_dataframe 函數(shù):
- 輸入: DataFrame對(duì)象和任意數(shù)量的篩選條件
- 輸出: 篩選后的DataFrame
- 功能: 根據(jù)提供的列名和值進(jìn)行篩選,支持單個(gè)值或值列表
使用示例
# 讀取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'])
注意事項(xiàng)
- 請(qǐng)確保文件路徑正確,并且有讀取權(quán)限
- 根據(jù)實(shí)際CSV文件的分隔符調(diào)整
delimiter參數(shù) - 如果文件包含非ASCII字符,可能需要調(diào)整
encoding參數(shù) - 如果列名包含空格或特殊字符,請(qǐng)確保在篩選條件中正確引用
到此這篇關(guān)于Python Excel 通用篩選函數(shù)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python Excel篩選函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python numpy庫(kù)linspace相同間隔采樣的實(shí)現(xiàn)
這篇文章主要介紹了python numpy庫(kù)linspace相同間隔采樣的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
python實(shí)現(xiàn)可視化動(dòng)態(tài)CPU性能監(jiān)控
這篇文章主要為大家詳細(xì)介紹了python可視化動(dòng)態(tài)CPU性能監(jiān)控,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
Python深度學(xué)習(xí)pytorch實(shí)現(xiàn)圖像分類數(shù)據(jù)集
這篇文章主要為大家講解了關(guān)于Python深度學(xué)習(xí)中pytorch實(shí)現(xiàn)圖像分類數(shù)據(jù)集的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10
Python?SQLAlchemy與數(shù)據(jù)庫(kù)交互操作完整指南
SQLAlchemy 是一個(gè)強(qiáng)大的 Python 庫(kù),用于數(shù)據(jù)庫(kù)操作,無(wú)論是簡(jiǎn)單的數(shù)據(jù)存儲(chǔ)還是復(fù)雜的數(shù)據(jù)管理,SQLAlchemy 都提供了多種方法來(lái)處理數(shù)據(jù)庫(kù),本文將全面介紹 SQLAlchemy的基本用法以及各種操作的示例代碼2024-01-01
解決python3 urllib 鏈接中有中文的問(wèn)題
今天小編就為大家分享一篇解決python3 urllib 鏈接中有中文的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
python中pandas.read_csv()函數(shù)的實(shí)現(xiàn)
本文主要介紹了python中pandas.read_csv()函數(shù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-05-05

