我如何根据给定的类\标签分布值对 pandas 数据框或 graphlab sframe 进行采样,例如:我想对具有标签\类列的数据框进行采样以选择行,以便平均获取每个类标签,从而具有每个类标签的相似频率对应于类标签的均匀分布。或者最好是根据我们想要的类别分布获取样本。
+------+-------+-------+ | col1 | clol2 | class | +------+-------+-------+ | 4 | 45 | A | +------+-------+-------+ | 5 | 66 | B | +------+-------+-------+ | 5 | 6 | C | +------+-------+-------+ | 4 | 6 | C | +------+-------+-------+ | 321 | 1 | A | +------+-------+-------+ | 32 | 432 | B | +------+-------+-------+ | 5 | 3 | B | +------+-------+-------+ given a huge dataframe like above and the required frequency distribution like below: +-------+--------------+ | class | nostoextract | +-------+--------------+ | A | 2 | +-------+--------------+ | B | 2 | +-------+--------------+ | C | 2 | +-------+--------------+
上面应该根据第二帧中给定的频率分布从第一个数据帧中提取行,其中频率计数值在 nostoextract 列中给出,以给出每个类最多出现 2 次的采样帧。如果找不到足够的类来满足所需的计数,应该忽略并继续。生成的数据帧将用于基于决策树的分类器。
正如评论员所说,采样数据框必须包含相应类的 nostoextract 不同实例?除非给定类没有足够的示例,在这种情况下,您只需使用所有可用的示例。
最佳答案
您能否将您的第一个数据帧拆分为特定类的子数据帧,然后从中随意采样?
即
dfa = df[df['class']=='A']
dfb = df[df['class']=='B']
dfc = df[df['class']=='C']
....
然后在 dfa、dfb、dfc 上拆分/创建/过滤后,根据需要从顶部选择一个数字(如果数据帧没有任何特定的排序模式)
dfasamplefive = dfa[:5]
或者使用之前评论者描述的sample方法直接随机抽样:
dfasamplefive = dfa.sample(n=5)
如果这符合您的需要,剩下要做的就是自动化该过程,输入要从您拥有的控制数据帧中采样的数量作为包含所需样本数量的第二个数据帧。
关于python - 根据给定的分布对数据帧进行采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33097167/