我正在尝试将 Pandas 数据帧拆分为多个单独的数据帧,其中一列在生成的数据帧中均匀分布。例如,如果我希望将以下数据帧拆分为 3 个不同的数据帧,其中每个数据帧包含每个扇区的一个记录(随机选择(。
所以一个看起来像这样的df
:
id Name Sector
1 John A
2 Steven A
3 Jane A
4 Kyle A
5 Ashley B
6 Ken B
7 Tom B
8 Peter B
9 Elaine C
10 Tom C
11 Adam C
12 Simon C
13 Stephanie D
14 Jan D
15 Marsha D
16 David D
17 Drew E
18 Kit E
19 Corey E
20 James E
将生成两个数据帧,其中一个可能如下所示,而另一个由其余记录组成。
id Name Sector
1 John A
2 Steven A
7 Tom B
8 Peter B
10 Tom C
11 Adam C
13 Stephanie D
16 David D
19 Corey E
20 James E
我知道np.array_split(df, 2)
会让我半途而废,但它可能不会像我需要的那样均匀地分配部门。
(为清楚起见,已编辑(
根据评论和更新的问题进行更新:
df_1=df.groupby('Sector', as_index=False, group_keys=False).apply(lambda x: x.sample(n=2))
df_2 = df[~df.index.isin(df_1.index)]
print(df_1)
id Name Sector
2 3 Jane A
3 4 Kyle A
7 8 Peter B
5 6 Ken B
11 12 Simon C
9 10 Tom C
12 13 Stephanie D
15 16 David D
19 20 James E
17 18 Kit E
print(df_2)
id Name Sector
0 1 John A
1 2 Steven A
4 5 Ashley B
6 7 Tom B
8 9 Elaine C
10 11 Adam C
13 14 Jan D
14 15 Marsha D
16 17 Drew E
18 19 Corey E
这是一种"时髦"的方法,使用顺序编号和随机抽样:
df['grp'] = df.groupby('Sector')['Sector']
.transform(lambda x: x.notna().cumsum().sample(frac=1))
dd = dict(tuple(df.groupby('grp')))
输出:
dd[1]
id Name Sector grp
0 1 John A 1
4 5 Ken B 1
6 7 Elaine C 1
dd[2]
id Name Sector grp
2 3 Jane A 2
5 6 Tom B 2
7 8 Tom C 2
dd[3]
id Name Sector grp
1 2 Steven A 3
3 4 Ashley B 3
8 9 Adam C 3
详:
- 在每个扇区组中创建一个从 1 开始的数字序列, 然后随机化组中的数字以创建分组键, 嘎。 使用 grp
- 进行分组,然后创建一个字典,其中包含每个 grp 的键。
这是我的方法,您可以按扇区groupby
并使用sample
函数从每个循环中随机选择:
for x, i in df.groupby('Sector'):
print(i.sample())
如果需要多个随机选择,请使用sample
函数指定所需的项目数。例如:
for x, i in df.groupby('Sector'):
print(i.sample(2))
将从每组返回 2 个随机值。