首页 > 解决方案 > 即使子值的数据帧中的数据较少,也获取 N 个样本

问题描述

我有一个数据框,它包含三列 m_name、description、type。该类型具有值“c”和“b”。我想为数据框中的每个名称分别获取 50 个样本,对于类型 c 和 b,各获取 25 个样本。我可以通过以下代码做到这一点。

sam_size=50 
mlist=list(df['m_name'].unique())
s=int(sam_size/2)
df_s=pd.DataFrame()
for m in mlist:
    x=df[df['m_name']==m]
    #print(m+":"+str(len(x)))
    #a=0
    lb=len(x[x['type']=='b'])
    lc=len(x[x['type']=='c'])
    
    print(m+":"+str(len(x))+":"+str(lb)+":"+str(lc))
    
    if(len(x[x['type']=='b'])<s):
        df_s=df_s.append(x[x['type']=='b'])
    else:
        df_s=df_s.append(x[x['type']=='b'].sample(n=s))
        
    if(len(x[x['type']=='c'])<s):
        df_s=df_s.append(x[x['type']=='c'])
    else:
        df_s=df_s.append(x[x['type']=='c'].sample(n=s))
    

在上面的代码中,如果任何特定类型的值少于 25 个,代码将把整个值作为样本。

我面临的问题是,如果“b”有 100 个值而“c”只有 10 个值,那么样本将只有 25 个“b”和 10 个“c”。

我想在上述条件下填充'b'类型的其余部分。

所以这个想法是,如果任何 m_name 有超过 50 个数字,我想获得 50 个样本,即使其中一种类型少于 25 个。

有什么方法可以通过示例函数高级方法轻松实现?

标签: pythonpandasdataframesampling

解决方案


不要循环和追加。尝试groupby().sample

df.groupby(['m_name','type']).sample(n=25, replace=True)

如果您想尽可能不更换样品(例如,多于25可用):

(df.groupby(['m_name','type'])
   .apply(lambda x: x.sample(n=25, replace= len(x) < 25)
)

推荐阅读