Python 拆分一个数据帧,其中一个因子列在拆分中均匀分布
我试图将一个Pandas数据帧拆分为多个单独的数据帧,其中一列均匀分布在生成的数据帧中。例如,如果我想将以下数据帧拆分为3个不同的数据帧,其中每个数据帧包含每个扇区的一条记录(随机选择) 所以一个Python 拆分一个数据帧,其中一个因子列在拆分中均匀分布,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我试图将一个Pandas数据帧拆分为多个单独的数据帧,其中一列均匀分布在生成的数据帧中。例如,如果我想将以下数据帧拆分为3个不同的数据帧,其中每个数据帧包含每个扇区的一条记录(随机选择) 所以一个df看起来像这样: id Name Sector 1 John A 2 Steven A 3 Jane A 4 Kyle A 5 Ashley B
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。数组分割(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的键
sample
功能按扇区groupby
从每个循环组中随机选择:
for x, i in df.groupby('Sector'):
print(i.sample())
如果需要多个随机选择,请使用sample
函数指定所需的项目数量。例如:
for x, i in df.groupby('Sector'):
print(i.sample(2))
将从每个组返回2个随机值。在我的示例中效果很好,在新数据帧中,每个组只需要一条记录。如果您有一个更大的起始数据帧,并且希望每个组有多条记录,您有什么建议吗?@T.Shiftlet您必须在示例函数(此处设置为1)中尝试数字;)@Giuseppe,我试过的第一件事,但是如果你拥有的组数不等于每个组的记录数,你会得到错误
ValueError:当'replace=False'
(将replace设置为True只会导致不同的错误)。@t.Shiftlet你能添加更大的数据集和不同的N,并显示预期输出?