You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python DataFrame中按子类别列表循环过滤生成对应DataFrame

生成对应子类别命名的DataFrame解决方案

问题背景

用户拥有子类别列表:

lst = [7774, 29409, 36611, 77553]

以及如下Pandas DataFrame:

import pandas as pd
data = {'aucctlg_id': [143424, 143424, 143424, 143388, 143388, 143430],
        'catalogversion_id': [1, 1, 1, 1, 1, 1.2],
        'Key': [1434241, 1434241, 1434241, 1433881, 1433881, 14343012],
        'item_id': [4501118, 4501130, 4501129, 4501128, 4501127, 4501126],
        'catlog_description': ['M&BP PIG IRON FA', 'M&BP PIG IRON FA', 'M&BP PIG IRON FA', 'PIG IRON MIXED OG','PIG IRON MIXED OG', 'P.S JAM & PIG IRON FINES'],
        'catlog_start_date': ['17-05-2024  11:00:00', '17-05-2024  11:00:00', '17-05-2024  11:00:00', '17-05-2024  11:00:00','17-05-2024  11:00:00', '17-05-2024  11:00:00'],
        'subcategoryid': [29409, 29409, 29409, 7774, 7774, 36611],
        'quantity': [200, 200, 200, 180, 180, 100],
        'auctionable': ['Y', 'Y', 'Y', 'Y' ,'Y' ,'Y']
}
df = pd.DataFrame(data)

用户原代码仅生成DataFrame列表,无法得到df_7774这类命名的单个DataFrame:

new=[]
for i in range(0, len(lst)):
    mask1 = df['subcategoryid']==(lst[i])
    df2 = df.loc[mask1]
    new.append(df2)

需求是生成对应每个子类别的命名DataFrame,如df_7774、df_29409、df_36611。

解决方案

方法1:直接创建全局命名变量

可以利用Python的globals()函数,动态创建以df_+子类别ID命名的全局变量:

lst = [7774, 29409, 36611, 77553]

for sub_id in lst:
    # 筛选对应子类别的数据
    filtered_df = df[df['subcategoryid'] == sub_id]
    # 动态生成变量名并赋值
    globals()[f'df_{sub_id}'] = filtered_df

执行后,你就可以直接使用df_7774、df_29409等变量,其中df_77553会是一个空的DataFrame(因为原数据中没有这个子类别ID)。

方法2:用字典存储(推荐)

直接创建大量全局变量容易导致命名混乱,更推荐用字典统一管理这些子类别DataFrame,既方便查找又便于维护:

lst = [7774, 29409, 36611, 77553]
sub_dfs = {}

for sub_id in lst:
    sub_dfs[f'df_{sub_id}'] = df[df['subcategoryid'] == sub_id]

要访问对应子类别DataFrame时,只需通过字典键名调用,比如sub_dfs['df_7774']即可获取对应数据。


内容的提问来源于stack exchange,提问作者Ami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 23:05:16