Pandas 基于条件和样本大小的数据帧样本

Pandas dataframe sample based on condition and sample size

代码:

import pandas as pd

df = pd.DataFrame({'data': list(range(100))})

我想取一个大小为 20 的样本,这样 80% 的元素在 0 到 10 之间,20% 的元素在 50 到 70 之间。(随机抽样)。

我想要一种适用于任意数量条件的方法。

我的想法可行但不干净: 对 0 到 10 之间的所有内容进行采样,并取 80% * 20 个随机行,对其余值执行相同操作,然后连接。 是否有我可以使用的 pandas 内置函数,因为它不能很好地适应更多条件?

您可以使用 bin 和比例字典进行抽样。

      # ┌─0─┐┌─1─┐┌─2─┐┌─3───┐
bins = [-1, 10, 50, 70, float('inf')]
fraction = {0: 0.8, 2: 0.2} # group 0 is -1-10, group 2 is 50-70
size = 20

groups = pd.cut(df['data'], bins=bins, labels=range(len(bins)-1))

sampled = (df
  .groupby(groups)['data']
  .apply(lambda g: g.sample(n=int(fraction.get(g.name, 0)*size),
                            replace=True)
        )
  #.droplevel(0)
 )

注意。我在这里的示例中使用了 replace=True,因为否则不可能从 0-10 组中获得 16 个唯一元素,但您可以在您的真实数据中更改它,条件是安全的。此外,添加 .droplevel(0) 以删除组 ID。

输出:

data    
0     6      6
      8      8
      2      2
      3      3
      0      0
      0      0
      6      6
      0      0
      6      6
      3      3
      10    10
      3      3
      8      8
      8      8
      8      8
      2      2
2     54    54
      53    53
      62    62
      64    64
Name: data, dtype: int64