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

2024-10-03 21:27:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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尝试,但我显然遗漏了一些东西


Tags: 数据truedataframedftypenprandomproduct
3条回答

我们还可以使用布尔掩码和内置聚合函数(以提高执行速度)而不是自定义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

您可以创建一个自定义布尔值来groupby,并在字典中创建两个单独的数据帧。假设Inv_Type中只有两个值,那么我们可以使用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
m = df.groupby("Product")["Inv_Type"].transform(lambda x: len(x.unique()) == 1)

df1 = df[~m]
df2 = df[m]
print(df1)
print(df2)

印刷品:

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

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

相关问题 更多 >