【问题标题】:Python - Pandas random sampling per groupPython - 每组 Pandas 随机抽样
【发布时间】:2018-09-12 03:59:41
【问题描述】:

我有一个与它非常相似的数据框,但有数千个值:

import numpy as np
import pandas as pd 

# Setup fake data.
np.random.seed([3, 1415])      
df = pd.DataFrame({
    'Class': list('AAAAAAAAAABBBBBBBBBB'),
    'type': (['short']*5 + ['long']*5) *2,
    'image name': (['image01']*2  + ['image02']*2)*5,
    'Value2': np.random.random(20)})

我能够找到一种方法,使用以下代码对每个图像、每个类别和每个类型的 2 个值进行随机抽样:

df2 = df.groupby(['type', 'Class', 'image name'])[['Value2']].apply(lambda s: s.sample(min(len(s),2)))

我得到了以下结果:

我正在寻找一种方法对该表进行子集化,以便能够为每个类型和每个类随机选择一个随机图像(“图像名称”)(并为随机选择的图像保留 2 个值。

我想要的输出的 Excel 示例:

【问题讨论】:

  • 你问题的最后一部分不清楚......你能解释一下你的意思吗?
  • 在上面的示例中(链接“我的表格”),表格有 2 个图像,每个图像包含 2 个值,每个类型和每个类。我希望能够通过随机拥有 1 个包含 2 个值(每个类型和每个类)的图像来转换表格。在上面的示例中,它将为每个条件随机删除一个图像。在我的真实数据集中,我希望能够为每个条件随机选择“n”个图像。我希望这会有所帮助

标签: python pandas numpy random


【解决方案1】:

IIUC,问题是您不想按列image name 分组,但如果该列不包含在分组依据中,您将丢失此列

你可以先创建grouby对象

gb = df.groupby(['type', 'Class'])

现在您可以使用列表理解对 grouby 块进行交互

blocks = [data.sample(n=1) for _,data in gb]

现在您可以连接块,以重建您随机采样的数据帧

pd.concat(blocks)

输出

   Class    Value2 image name   type
7      A  0.817744    image02   long
17     B  0.199844    image01   long
4      A  0.462691    image01  short
11     B  0.831104    image02  short

你可以修改你的代码,像这样将image name列添加到groupby中

df.groupby(['type', 'Class'])[['Value2','image name']].apply(lambda s: s.sample(min(len(s),2)))

                  Value2 image name
type  Class
long  A     8   0.777962    image01
            9   0.757983    image01
      B     19  0.100702    image02
            15  0.117642    image02
short A     3   0.465239    image02
            2   0.460148    image02
      B     10  0.934829    image02
            11  0.831104    image02

编辑:保持每组图像相同

我不确定您是否可以避免使用迭代过程来解决这个问题。您可以循环遍历 groupby 块,过滤组,获取随机图像并保持每组相同的名称,然后像这样从剩余图像中随机采样

import random

gb = df.groupby(['Class','type'])
ls = []

for index,frame in gb:
    ls.append(frame[frame['image name'] == random.choice(frame['image name'].unique())].sample(n=2))

pd.concat(ls)

输出

   Class    Value2 image name   type
6      A  0.850445    image02   long
7      A  0.817744    image02   long
4      A  0.462691    image01  short
0      A  0.444939    image01  short
19     B  0.100702    image02   long
15     B  0.117642    image02   long
10     B  0.934829    image02  short
14     B  0.721535    image02  short

【讨论】:

  • 你的第二个例子是完美的,但是当我运行它时我得到了不同的结果。示例:对于每个组(类型/类),我从 2 个不同的图像中获得两个“values2”。我希望每个组都有相同的“图像名称”。 IDK 如果有意义的话
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-06
  • 2013-08-17
  • 2015-08-16
  • 1970-01-01
  • 2017-10-15
  • 2020-05-31
  • 1970-01-01
相关资源
最近更新 更多