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]