如何基于动态条件从Pandas DataFrame中筛选指定列数据?
动态筛选Pandas DataFrame并保留指定列的通用方案
这个需求在多API接口的动态数据筛选场景里特别常见,我们可以通过基于配置表(df2)动态生成筛选规则的方式,实现完全通用的代码,不用针对每个API硬编码逻辑。
先看示例数据
先定义两个示例DataFrame帮你理解逻辑:
import pandas as pd # 主数据df_main,包含各类业务字段 df_main = pd.DataFrame({ 'kol_id': [1, 2, 3, 4, 5], 'jnj_id': ['A1', 'A2', 'A3', 'A4', 'A5'], 'platform': ['抖音', '快手', '抖音', '小红书', '抖音'], 'fans_count': [10000, 50000, 8000, 20000, 15000] }) # 配置表df2,每个api_name对应一套筛选规则和要保留的列 # 这里扩展了operator字段,支持>、<、==等多种筛选操作 df2 = pd.DataFrame({ 'api_name': ['api_douyin', 'api_high_fans', 'api_kuaishou'], 'filter': ['platform', 'fans_count', 'platform'], 'operator': ['==', '>', '=='], 'filter_value': ['抖音', 10000, '快手'], 'columns': [['kol_id', 'jnj_id'], ['kol_id', 'fans_count', 'platform'], ['jnj_id', 'fans_count']] })
通用实现代码
写一个可复用的函数,传入目标API名称、主数据和配置表,直接得到筛选后的结果:
def get_api_filtered_data(target_api, main_df, config_df): # 从配置表提取当前API的规则(确保只取当前API的配置) api_config = config_df[config_df['api_name'] == target_api].iloc[0] # 动态构建查询语句,支持各种操作符 query_condition = f"{api_config['filter']} {api_config['operator']} @api_config['filter_value']" # 执行筛选 filtered_data = main_df.query(query_condition) # 保留配置指定的列 result_df = filtered_data[api_config['columns']].reset_index(drop=True) return result_df
测试调用
针对不同API测试效果:
# 筛选抖音KOL,保留kol_id和jnj_id douyin_result = get_api_filtered_data('api_douyin', df_main, df2) print("抖音API筛选结果:") print(douyin_result) # 筛选粉丝数大于10000的KOL,保留多列 high_fans_result = get_api_filtered_data('api_high_fans', df_main, df2) print("\n高粉丝API筛选结果:") print(high_fans_result)
扩展支持多条件筛选
如果单个API需要多个筛选条件(比如同时满足平台是抖音且粉丝数>10000),只需调整配置表和函数:
- 修改df2,让同一个api_name对应多行配置:
df2_multi = pd.DataFrame({ 'api_name': ['api_douyin_high_fans', 'api_douyin_high_fans'], 'filter': ['platform', 'fans_count'], 'operator': ['==', '>'], 'filter_value': ['抖音', 10000], 'columns': [['kol_id', 'fans_count'], ['kol_id', 'fans_count']] })
- 更新函数支持多条件叠加:
def get_multi_condition_api_data(target_api, main_df, config_df): api_configs = config_df[config_df['api_name'] == target_api] # 构建多条件查询语句(默认是AND关系) query_conditions = [] for _, row in api_configs.iterrows(): query_conditions.append(f"{row['filter']} {row['operator']} @row['filter_value']") full_query = ' & '.join(query_conditions) # 筛选并保留列 filtered_data = main_df.query(full_query) target_columns = api_configs['columns'].iloc[0] result_df = filtered_data[target_columns].reset_index(drop=True) return result_df
关键优势
- 完全动态适配:所有筛选规则、保留列都从df2读取,新增API只需要在配置表中加一行,不用修改代码
- 灵活支持多种操作:通过operator字段可以扩展等于、大于、小于、包含等各种筛选逻辑
- 代码复用性高:一次编写可以适配所有API的需求
内容的提问来源于stack exchange,提问作者shivam patel




