【问题标题】:Using Pandas to sample DataFrame using a specific column's weight使用 Pandas 使用特定列的权重对 DataFrame 进行采样
【发布时间】:2017-05-22 13:30:24
【问题描述】:

我有一个如下所示的 DataFrame:

  index  name   city
  0      Yam    Hadera
  1      Meow   Hadera
  2      Don    Hadera
  3      Jazz   Hadera
  4      Bond   Tel Aviv
  5      James  Tel Aviv

我希望 Pandas 随机选择值,使用 city 列中的出现次数(使用类型:df.city.value_counts()),所以我的魔术函数的结果,假设:

df.magic_sample(3, weight_column='city')

可能看起来像:

  0     Yam      Hadera
  1     Meow     Hadera
  2     Bond     Tel Aviv

谢谢! :)

【问题讨论】:

    标签: python pandas dataframe statistics


    【解决方案1】:

    如果我正确理解了这个问题,也许您正在寻找random.sample

    >>> import pandas as pd
    >>> from random import sample
    >>> df = pd.DataFrame(data=[('Yam', 'Hadera'), ('Meow', 'Hadera'), ('Don', 'Hadera'), ('Jazz', 'Hadera'), ('Bond', 'Tel Aviv'), ('James', 'Tel Aviv')], columns=('name', 'city'))
    >>> df
        name      city
    0    Yam    Hadera
    1   Meow    Hadera
    2    Don    Hadera
    3   Jazz    Hadera
    4   Bond  Tel Aviv
    5  James  Tel Aviv
    >>> df.iloc[sample(range(len(df)), 3), :]
       name      city
    4  Bond  Tel Aviv
    0   Yam    Hadera
    1  Meow    Hadera
    

    【讨论】:

      【解决方案2】:

      您可以按city 分组,然后根据每个组的长度与原始数据框的长度进行比较:

      df.groupby('city', group_keys=False).apply(lambda g: g.sample(3 * len(g)/len(df)))
      

      【讨论】:

      • 谢谢!最终,对于较大的数据集,它会在整体中选择少于 N 的值(在您的示例中,N=3)。有没有办法让我总共得到 N 个值?
      • @Infinity 如果有 10 个组,每组 2 行,N=3,会发生什么?
      • 正如@TedPetrou 评论的那样,这种采样方法可能并不总是有效,因为您只能从组中采样整数行,但 weight * total number of rows 可以小数。
      猜你喜欢
      • 2012-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      • 2017-05-21
      相关资源
      最近更新 更多