拆分 Pandas 数据帧,其中一个因子列在拆分之间均匀分布



我正在尝试将 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 个随机值。

相关内容

  • 没有找到相关文章

最新更新