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我很乐意在这里回答:)但如果你问了一个新问题,也没关系。但是我还看不到。我现在正在工作。我会在措辞上下功夫,稍后再发