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)