基于列分布随机采样 Pandas 数据框

Jon*_*ler 7 python pandas

假设我有一个非常大的数据帧,我想对其进行采样以尽可能匹配数据帧列的分布(在本例中为“偏差”列)。

我跑:

train['bias'].value_counts(normalize=True)
Run Code Online (Sandbox Code Playgroud)

并查看:

least           0.277220
left            0.250000
right           0.250000
left-center     0.141244
right-center    0.081536
Run Code Online (Sandbox Code Playgroud)

如果我想抽取训练数据帧的样本,其中样本的“偏差”列的分布与该分布相匹配,那么最好的方法是什么?

Dan*_*ejo 5

您可以使用文档中的示例:

从对象轴返回项目的随机样本。

诀窍是在每个组中使用示例,代码示例:

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'))
Run Code Online (Sandbox Code Playgroud)

输出

(5000, 2)
              title
position           
least           277
left            250
left-center     141
right           250
right-center     81
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,我创建了一个包含 5000 行和 2 列的数据框,这是输出的第一部分。

我假设您有一个位置字典(将 DataFrame 转换为字典请参阅),其中包含每组中的样本百分比和总参数(即样本总数)。

在输出的第二部分中,您可以看到 100 行中最少有 277 行277 / 1000 = 0.277。这是所需的近似值,其他组也是如此。但需要注意的是,样本数量是 999 个,而不是预期的 1000 个。