You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何基于动态条件从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),只需调整配置表和函数:

  1. 修改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']]
})
  1. 更新函数支持多条件叠加:
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

火山引擎 最新活动