如何编写通用函数从Pandas DataFrame中按自定义约束筛选行?
Pandas 处理新冠疫情数据集:查询与通用函数实现
1. 导入并合并多个CSV数据集
先把所有CSV文件批量读取并合并成一个统一的DataFrame,方便后续操作:
import pandas as pd import glob # 替换成你的CSV文件所在文件夹路径 csv_file_paths = glob.glob("./covid_datasets/*.csv") # 批量读取每个CSV并存入列表 dataset_list = [] for file_path in csv_file_paths: single_df = pd.read_csv(file_path) dataset_list.append(single_df) # 合并所有数据集,重置索引 combined_covid_df = pd.concat(dataset_list, ignore_index=True) # 快速查看关键列的前几行数据 print(combined_covid_df[["country_region", "last_update", "confirmed"]].head())
2. 查询德国的新冠确诊病例数
直接用布尔索引筛选country_region等于"Germany"的行,还可以按更新时间排序取最新数据:
# 筛选德国的数据(注意大小写匹配,不放心可以统一转小写) germany_covid_data = combined_covid_df[combined_covid_df["country_region"].str.lower() == "germany"] # 按更新时间倒序,取最新的确诊数记录 latest_germany_confirmed = germany_covid_data.sort_values("last_update", ascending=False)[["last_update", "confirmed"]].iloc[0] print(f"德国最新确诊数:{latest_germany_confirmed['confirmed']},更新时间:{latest_germany_confirmed['last_update']}")
3. 通用查询函数实现
写一个通用函数,支持传入任意列名和匹配值,返回符合条件的DataFrame切片,还能扩展支持不同的匹配逻辑:
基础版(精确匹配)
def get_filtered_df(df, target_column, match_value): # 先检查目标列是否存在 if target_column not in df.columns: raise ValueError(f"数据集中没有 {target_column} 这一列") # 返回匹配的切片 return df[df[target_column] == match_value] # 用函数查德国数据 germany_data = get_filtered_df(combined_covid_df, "country_region", "Germany") print(germany_data.head()) # 用函数查某一特定更新时间的数据 specific_date_data = get_filtered_df(combined_covid_df, "last_update", "2023-12-01") print(specific_date_data.head())
进阶版(支持多种匹配逻辑)
如果需要大于、小于、包含等匹配方式,可以加个操作符参数:
import operator def flexible_filter_df(df, target_column, match_value, compare_op=operator.eq): if target_column not in df.columns: raise ValueError(f"数据集中没有 {target_column} 这一列") # 根据传入的操作符执行匹配 return df[compare_op(df[target_column], match_value)] # 示例:查询确诊数大于500000的国家数据 high_confirmed_data = flexible_filter_df(combined_covid_df, "confirmed", 500000, compare_op=operator.gt) print(high_confirmed_data[["country_region", "confirmed"]].head()) # 示例:查询国家名称包含"States"的数据 states_countries = flexible_filter_df( combined_covid_df, "country_region", "States", compare_op=lambda col_val, val: col_val.str.contains(val) ) print(states_countries["country_region"].unique())
内容的提问来源于stack exchange,提问作者Anden120
相关产品推荐
相关产品推荐

