假设我有一个非常大的数据框,我想对其进行采样以尽可能匹配数据框的列的分布(在本例中为“ bias”列)。
我跑步:
train['bias'].value_counts(normalize=True)
并查看:
least 0.277220
left 0.250000
right 0.250000
left-center 0.141244
right-center 0.081536
如果我想从样本的“ bias”列的分布与该分布匹配的火车数据帧中抽取一个样本,那是最好的解决方法?
答案 0 :(得分:1)
您可以从文档中使用sample:
从对象轴返回随机的项目样本。
诀窍是在每个组中使用示例,这是一个代码示例:
import pandas as pd
positions = {"least": 0.277220, "left": 0.250000, "right": 0.250000, "left-center": 0.141244, "right-center": 0.081536}
data = [['title-{}-{}'.format(i, position), position] for i in range(1000) for position in positions.keys()]
frame = pd.DataFrame(data=data, columns=['title', 'position'])
print(frame.shape)
def sample(obj, replace=False, total=1000):
return obj.sample(n=int(positions[obj.name] * total), replace=replace)
result = frame.groupby('position', as_index=False).apply(sample).reset_index(drop=True)
print(result.groupby('position').agg('count'))
输出
(5000, 2)
title
position
least 277
left 250
left-center 141
right 250
right-center 81
在上面的示例中,我创建了一个具有5000行2列的数据框,这是输出的第一部分。
我假设您有一个位置字典(要将DataFrame转换为字典,请参见this),其中包含每个组中要采样的百分比和一个总参数(即要采样的总数)。
在输出的第二部分中,您可以看到100列中最少有277行,277 / 1000 = 0.277
。这是所需数量的近似值,其余组也是如此。需要注意的是,样本数量为999,而不是预期的1000。
答案 1 :(得分:0)
这里是一个根据分布进行采样的衬里
positions = {"least": 0.277220, "left": 0.250000, "right": 0.250000, "left-center": 0.141244, "right-center": 0.081536}
total = len(df)
df = pd.concat([df[df['position'] == k].sample(int(v * total), replace=False) for k, v in fps_dict.items()])