Python:不平衡数据的分层抽样

Python:不平衡数据的分层抽样,python,pandas,dataframe,sampling,Python,Pandas,Dataframe,Sampling,这是我的数据框: df = pd.DataFrame({'var1': [1,2,3,4,5,6,7,8,9,10,11,12,13,14], 'var2': ['a','a','a','a','b','b','b','b','b','b','b','c','d','d'], 'var3': ['y','y','y','y','r','r','r','r','r','r','r','q','q', 'r'],

这是我的数据框:

df = pd.DataFrame({'var1': [1,2,3,4,5,6,7,8,9,10,11,12,13,14],
                   'var2': ['a','a','a','a','b','b','b','b','b','b','b','c','d','d'],
                   'var3': ['y','y','y','y','r','r','r','r','r','r','r','q','q', 'r'],
                   'var4': [0,1,0,0,1,1,0,0,0,0,0,0,0,0]})
因为var4是不平衡的。我计划根据组
var2
var3
服用每个
var4=1
和两倍量的
var4=0
。因此,组“a”“y”将有一个“1”和两个“0”;组“b”“r”将有两个“1”和4个“0”。其他团体则没有。如下所示:

df_sampled = pd.DataFrame({'var1': [1,2,3,5,6,7,8,10,11],
                   'var2': ['a','a','a','b','b','b','b','b','b'],
                   'var3': ['y','y','y','r','r','r','r','r','r'],
                   'var4': [0,1,0,1,1,0,0,0,0]})
我试图计算出每组var4=1的大小:

df.var4 = df.var4.mask(df.var4.ne(1))
dd = df.groupby(['var2', 'var3']).var4.count().tolist()
我还尝试使用
sample()
在列表dd上运行:

df.loc[df['var4'] == 0].groupby(['var2','var3'], group_keys=False).apply(lambda x: x.sample(dd))

然而,它不起作用。有什么建议吗?

让我们这样试试。排序
df
将所有
1
推到顶部
cumcount
var1
var2
的groupby上用作计数器。获取每组的总和(由于
var4
值仅为
0
1
,因此每组的总和是每组中
1
的数量)。最后,对计数器小于或等于总和两倍的行进行切片

df = df.sort_values('var4', ascending=False)
gb = df.groupby(['var2', 'var3'])
s = gb.cumcount().add(1)
s1 = gb.var4.transform('sum')
df_final =  df[(s - s1) <= (s1 * 2)].sort_index()

Out[1758]:
   var1 var2 var3  var4
0     1    a    y     0
1     2    a    y     1
2     3    a    y     0
4     5    b    r     1
5     6    b    r     1
6     7    b    r     0
7     8    b    r     0
8     9    b    r     0
9    10    b    r     0
df=df.sort_值('var4',升序=False)
gb=df.groupby(['var2','var3']))
s=gb.cumcount().add(1)
s1=gb.var4.transform('sum')
df_final=df[(s-s1)