Python 如何对dataframe的行进行采样/分组,以修复组内的特定分布?

Python 如何对dataframe的行进行采样/分组,以修复组内的特定分布?,python,pandas,pandas-groupby,mathematical-optimization,choice,Python,Pandas,Pandas Groupby,Mathematical Optimization,Choice,我有一个数据框c,包含一列a import numpy as np a = np.random.randint(0,10, size=(100)) c = pd.DataFrame(a, columns=['a']) 我想对c的行进行随机分组,这样每个组中有5行a2和至少1行'a==3' 我不知道如何以这样的方式编码,以最大限度地利用这个分组获得组数。例如,如果a==3非常有限,那么我不希望a>2选择3,即使它满足它的条件 我不确定,但我认为您描述的问题是NP完全问题,为此,我建议您考虑一种启

我有一个数据框
c
,包含一列
a

import numpy as np
a = np.random.randint(0,10, size=(100))
c = pd.DataFrame(a, columns=['a'])
我想对
c
的行进行随机分组,这样每个组中有5行
a<3

例如:

[1,2,3,2,10]  <-- good group 
[1,1,3,4,6]  <-- good group
[2,4,7,3,7] <-- bad group
这种方法的问题是,我不能将这种方法推广到子集相互重叠的更复杂的情况。比如

最多2行
a>2
和至少1行'a==3'


我不知道如何以这样的方式编码,以最大限度地利用这个分组获得组数。例如,如果a==3非常有限,那么我不希望a>2选择3,即使它满足它的条件

我不确定,但我认为您描述的问题是NP完全问题,为此,我建议您考虑一种启发式方法来找到满意的解决方案。为此,您可以编写一个贪婪启发式,如下所示:

def is_satisfying(group):
...     if (np.sum(group > 2) > 2) or (np.sum(group == 3) < 1): 
...             return False
...     else:
...             return True

为了标记已经添加到组中的元素,您可以使用一些数据结构,使您能够在采样之前过滤数据帧。但是,我可以看到在某些用例中,您可能希望跨多个列设置条件。例如,在一组人的数据集中,我想把人分成5组,这样至少有一个人年龄在20-29岁之间,他们拥有学士学位,其中a是年龄,b是教育水平。这是我所采用的一种方法,只是觉得使用while循环和随机抽样非常低效。此外,如果我不能进入第四组,我可能会陷入无限循环(但我想我可以使用计数器检查它运行了多少次)。谢谢你的建议。
def is_satisfying(group):
...     if (np.sum(group > 2) > 2) or (np.sum(group == 3) < 1): 
...             return False
...     else:
...             return True
group = []
while len(group) != 4 : 
...     np.append(group, df['a'].sample(n=1))
...     if not is_satisfying(group):
...             group = group[:-1]