如何在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
相关产品推荐
相关产品推荐

