Python 基于一列值拆分数据帧,该列值在另一列中包含多个类别值

Python 基于一列值拆分数据帧,该列值在另一列中包含多个类别值,python,pandas,Python,Pandas,我正在尝试从以下数据创建两个数据帧: 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, i

我正在尝试从以下数据创建两个数据帧:

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) --Help with visual
它们需要根据产品是否同时具有与它们相关联的X和Y,或者仅具有所有X或所有Y来进行分离

期望输出:

df1 = df[df['Product'] == 'Prod3']
df2 = df[df['Product'].str.contains('Prod1|Prod2|Prod5', na=False)]
我已经尝试过多次使用过滤器的groupby尝试,但我显然遗漏了一些东西

m = df.groupby("Product")["Inv_Type"].transform(lambda x: len(x.unique()) == 1)

df1 = df[~m]
df2 = df[m]
print(df1)
print(df2)
印刷品:

产品库存类型数量
12.3 X 4
13.3.18
14.3.11
15.3 X 5
16 Prod3 Y 5
17 Prod3 X 3
18 Prod3 X 16
19 Prod3 Y 11
产品库存类型数量
0.1 X 5
1个1 X 6
2.1 X 8
3.1 X 17
4.2.3
5.2.13
6.2.9
7.2.8
8.2.7
9.2.5
10.2.18
11 Prod2 Y 11
20.5 X 4
21.5 X 15
22.5 X 10
23.5 X 6

您可以创建一个自定义布尔值,以
groupby
,并在字典中创建两个单独的数据帧。假设您的
Inv_类型中只有两个值
,因此我们可以使用
nunique
来fidn任何具有多个值的组

dfs = {int(grp) : data for grp,data 
          in df.groupby([df.groupby('Product')['Inv_Type'].transform('nunique') > 1])}


print(dfs[1])

   Product Inv_Type  Quant
12   Prod3        X      2
13   Prod3        Y     12
14   Prod3        Y      2
15   Prod3        X     19
16   Prod3        Y      6
17   Prod3        X      5
18   Prod3        X      4
19   Prod3        Y     13

print(dfs[0])

   Product Inv_Type  Quant
0    Prod1        X     16
1    Prod1        X     13
2    Prod1        X      8
3    Prod1        X     16
4    Prod2        Y     14
5    Prod2        Y     10
6    Prod2        Y      4
7    Prod2        Y     13
8    Prod2        Y      7
9    Prod2        Y     16
10   Prod2        Y     13
11   Prod2        Y     11
20   Prod5        X     11
21   Prod5        X     10
22   Prod5        X     13
23   Prod5        X     10

我们还可以使用布尔掩码和内置聚合函数(以提高执行速度)而不是自定义lambda函数(未优化且速度较慢),如下所示:

mask = df.groupby("Product")["Inv_Type"].transform('nunique') > 1
df1 = df[mask]
df2 = df[~mask]
结果:

print(df1)


   Product Inv_Type  Quant
12   Prod3        X     15
13   Prod3        Y     19
14   Prod3        Y     16
15   Prod3        X     12
16   Prod3        Y      9
17   Prod3        X      8
18   Prod3        X      8
19   Prod3        Y      7



print(df2)


   Product Inv_Type  Quant
0    Prod1        X     17
1    Prod1        X     12
2    Prod1        X      9
3    Prod1        X      9
4    Prod2        Y      2
5    Prod2        Y     16
6    Prod2        Y     16
7    Prod2        Y      9
8    Prod2        Y     17
9    Prod2        Y     12
10   Prod2        Y     12
11   Prod2        Y     13
20   Prod5        X      2
21   Prod5        X     19
22   Prod5        X     16
23   Prod5        X     18

是唯一的值
X
Y
还是可以有更多?只有两个值,是的。但总是愿意学习如何处理更复杂的数据来爱这个网站。谢谢你的回答,我可以用3个或更多的类别变量添加另一个问题。不确定这是否违反了社区指导原则,但我可能会在将来使用它future@chasedcribbet我很乐意在这里回答:)但如果你问了一个新问题,也没关系。但是我还看不到。我现在正在工作。我会在措辞上下功夫,稍后再发