【问题标题】:Select random ordered sequence from dataframe从数据框中选择随机有序序列
【发布时间】:2022-01-09 17:11:15
【问题描述】:

给出一个包含如下数据的示例数据框:

ID Field_1 Field_2 Group
1    ABC     XYZ     B
2    BCD     ABF     B
3    EEJ     KYA     B
..
12   KAS     UUY     Z
13   OEP     PLO     Z
..
84   HJH     HIE     N
85   YSU     SAR     N

如何获得一个随机的、有序的序列,以便使用所需序列[B, Z, N, B] 调用此方法/lambda 将检索随机选择的行以匹配此条件?

我已经看到了以前的答案,它们可以根据组从样本中获取随机行 - 但是返回的选择没有排序。例如,对这个先前答案的引用可能是:Python: Random selection per group

【问题讨论】:

  • 从组 b 中选择两个,从 z 中选择一个,从 n 中选择一个。然后按顺序排序
  • 不能满足条件怎么办?例如,如果条件是 [....,N,B],则所有 B 行都在 N 行之前。
  • @Learningisames 数据框中的顺序无关紧要。如果它澄清了事情,我们可以假设数据帧的顺序也是随机的——即通过调用dataset.sample(frac=1, random_state=SEED).reset_index(drop=True)

标签: python python-3.x pandas dataframe


【解决方案1】:

使用DataFrame.sample 过滤boolean indexing 中的行应该没有groupby

order = ['B', 'Z', 'N', 'B']
df1 = pd.concat([df[df['Group'].eq(k)].sample(1) for k in order])
print (df1)
   ID Field_1 Field_2 Group
2   3     EEJ     KYA     B
4  13     OEP     PLO     Z
6  85     YSU     SAR     N
1   2     BCD     ABF     B

【讨论】:

    【解决方案2】:

    一种简单的方法是生成一个组字典并使用samplepandas.concat 的列表推导:

    order = ['B', 'Z', 'N', 'B']
    d = dict(list(df.groupby('Group')))
    df_sample = pd.concat([d[k].sample(1) for k in order])
    

    输出:

       ID Field_1 Field_2 Group
    1   2     BCD     ABF     B
    4  13     OEP     PLO     Z
    5  84     HJH     HIE     N
    2   3     EEJ     KYA     B
    

    注意。这将是抽样替换

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      • 2019-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多