案例目的
第一个函数从指定文件路径读取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数据并转换为dataframefilter_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")
使用说明
read_csv_to_dataframe 函数:
- 输入: 文件路径、分隔符(默认为制表符)、编码格式(默认为utf-8)
- 输出: pandas dataframe对象
- 功能: 从指定路径读取csv文件并转换为dataframe
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'])
注意事项
- 请确保文件路径正确,并且有读取权限
- 根据实际csv文件的分隔符调整
delimiter参数 - 如果文件包含非ascii字符,可能需要调整
encoding参数 - 如果列名包含空格或特殊字符,请确保在筛选条件中正确引用
到此这篇关于python excel 通用筛选函数的实现的文章就介绍到这了,更多相关python excel筛选函数内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论