Python - Pandas分组随机抽样

3

我有一个数据框与此非常相似,但包含数千个值:

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)))

我得到了以下结果:

My table

我希望找到一种方法来对该表进行子集,以便能够随机选择每种类型和每个类别的一个随机图像(“图像名称”),并保留所选图像的两个值。
期望输出的 Excel 示例:

Desired output


你问题的最后一部分不太清楚... 你能解释一下你的意思吗? - cs95
在上面的示例中(链接“我的表格”),每种类型和每个类别的表格中都有包含2个值的2个图像。 我希望能够通过随机选择一个包含2个值的图像(每种类型和每个类别)来转换表格。在上面的示例中,这意味着随机删除每个条件下的一个图像。在我的真实数据集中,我希望能够随机选择“n”个图像以满足每个条件。 希望这可以帮助您。 - Julien
1个回答

3

据我所知,问题在于您不想按图像名称列进行分组,但如果不将该列包含在groupby中,则会丢失此列。

您可以首先创建groupby对象。

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

现在你可以使用列表推导式对分组块进行迭代。
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”。我希望每个组都有相同的“图像名称”。 我不知道这是否有意义。 - Julien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接