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