python - 即使子值的数据帧中的数据较少,也获取 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 个。
有什么方法可以通过示例函数高级方法轻松实现?
解决方案
不要循环和追加。尝试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)
)
推荐阅读
- python - 从文本文件读取时无法正确编码字符串(编码为 sha256...)
- java - 如何实现对象特定的方法?
- google-sheets - 在 Google 表格中跨多个工作表程序引用数据
- elasticsearch - ping 期间发现的主节点不足 - Elasticsearch 集群自签名证书
- android - 哪种方法更适合创建 Android 别名资源?
- c# - 使用位置运算符时自定义反序列化器失败
- jinja2 - 如何在 BashOperator 中执行 python 代码和气流宏?
- php - imap_open 很长的延迟
- javascript - 使消息返回所有数据库行
- php - 使用 PHP 加载外部站点而不破坏该站点中的相关链接