如何以不同的速率从 pandas 数据框中对每个组进行采样
How do I Sample each group from a pandas data frame at different rates
我有一个数据框,其中包含我希望从中生成样本的人口信息。我还有一个数据框 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))
我想不出如何使用 group-by 引入样本量信息并按照
中的建议进行应用
将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)
我不确定速度,但对索引进行采样看起来至少可以节省内存
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
我有一个数据框,其中包含我希望从中生成样本的人口信息。我还有一个数据框 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))
我想不出如何使用 group-by 引入样本量信息并按照
将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)
我不确定速度,但对索引进行采样看起来至少可以节省内存
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