Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 拆分一个数据帧,其中一个因子列在拆分中均匀分布_Python_Pandas_Numpy_Dataframe - Fatal编程技术网

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

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

我试图将一个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。数组分割(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,并显示预期输出?