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

如何按关联列的多类别归属拆分pandas DataFrame

pandas DataFrame按分组属性拆分解决方案

实现代码

方案1:先筛选符合条件的商品列表,再拆分数据

这个方法逻辑简单易读,性能表现更好:

import pandas as pd
import numpy as np

# 你的示例构造代码(修正注释语法)
df = pd.DataFrame({'Product':['Prod1','Prod2','Prod3','Prod2','Prod5','Prod3']*4, 
                  'Inv_Type': ['X', 'Y']*12,
                 'Quant': np.random.randint(2,20, size=24)})
df.sort_values('Product', inplace=True, ignore_index=True) # 用于可视化查看

# 第一步:筛选出Inv_Type同时包含X、Y的Product
qualified_prod = df.groupby('Product')['Inv_Type'].nunique()
qualified_prod = qualified_prod[qualified_prod == 2].index.tolist()

# 第二步:拆分数据集
df1 = df[df['Product'].isin(qualified_prod)]
df2 = df[~df['Product'].isin(qualified_prod)]

如果你的Inv_Type可能存在X、Y之外的取值,可以把筛选逻辑换成更严谨的版本:

qualified_prod = df.groupby('Product')['Inv_Type'].apply(lambda x: {'X','Y'}.issubset(set(x)))
qualified_prod = qualified_prod[qualified_prod].index.tolist()

方案2:用transform直接生成判断标识

如果不想单独存储符合条件的商品列表,可以直接在原表生成判断列后拆分:

df['is_df1'] = df.groupby('Product')['Inv_Type'].transform(lambda x: {'X','Y'}.issubset(set(x)))
df1 = df[df['is_df1']].drop('is_df1', axis=1).reset_index(drop=True)
df2 = df[~df['is_df1']].drop('is_df1', axis=1).reset_index(drop=True)

两种方案运行后得到的df1、df2和你给出的期望输出完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 21:06:08