如何从熊猫数据框中以不同的速率对每个组进行采样

时间:2019-04-04 19:53:30

标签: python pandas sampling

我有一个数据框,其中包含有关希望从中生成样本的种群的信息。我还有一个数据框sample_info,其中详细说明了我的样本中population数据框中每个组需要多少个单元。我已经开发了一些代码,可以满足我的需要,但是运行速度比我要使用的大型数据集要慢。

有没有一种方法可以对总体框架进行分组并将抽样应用于组,而不是像我在下面所做的那样遍历它们?

import pandas as pd

population = pd.DataFrame([[1,True],[1,False],[1,False],[2,True],[2,True],[2,False],[2, True]], columns = ['Group ID','Response'])

    Group ID    Response
0   1           True
1   1           False
2   1           False
3   2           True
4   2           True
5   2           False
6   2           True

sample_info = pd.DataFrame([[1,5],[2,6]], columns = ['Group ID','Sample Size'])

output = pd.DataFrame(columns = ['Group ID','Response'])

    Group ID    Sample Size
0   1           5
1   2           6


for index, row in sample_info.iterrows():    
        output = output.append(population.loc[population['Group ID'] == row['Group ID']].sample(n=row['Sample Size'], replace = True)) 

我想不出使用分组方式引入样本量信息并按照Pandas: sample each group after groupby的建议进行应用

2 个答案:

答案 0 :(得分:3)

将sample_info转换为字典。按组ID进行组填充。使用字典将样本量值传递到DataFrame.sample。

mapper = sample_info.set_index('Group ID')['Sample Size'].to_dict()

population.groupby('Group ID').apply(lambda x: x.sample(n=mapper.get(x.name))).reset_index(drop = True)

答案 1 :(得分:2)

我不确定速度,但是采样索引看起来至少可以节省内存

d=population.groupby('Group ID').groups
a=np.concatenate([np.random.choice(d[x],y) for x, y in zip(sample_info['Group ID'],sample_info['Sample Size']) ])
population.loc[a]
Out[83]: 
   Group ID  Response
1         1     False
1         1     False
2         1     False
0         1      True
1         1     False
3         2      True
5         2     False
3         2      True
4         2      True
5         2     False
5         2     False