Python 熊猫:根据随机抽样后列表中的值追加所有行值
我有一个数据帧,如下所示Python 熊猫:根据随机抽样后列表中的值追加所有行值,python,pandas,Python,Pandas,我有一个数据帧,如下所示 ZZONE ZRET_QTY ZREQ_VAL ACTIVE BLR 100 22.26 1 BLR 125 25.66 1 BOM 223 29.56 1 BOM 133 26.55 0 BOM 98 18.56 1 BLR 2
ZZONE ZRET_QTY ZREQ_VAL ACTIVE
BLR 100 22.26 1
BLR 125 25.66 1
BOM 223 29.56 1
BOM 133 26.55 0
BOM 98 18.56 1
BLR 227 29.50 0
目标:
有一个数据帧,其中每个ZZONE
都有相同数量的1
和0
以活动状态出现。这种抽样应当是随机的。应该是这样的
ZZONE ZRET_QTY ZREQ_VAL ACTIVE
BLR 100 22.26 1
BLR 227 29.50 0
BOM 223 29.56 1
BOM 133 26.55 0
我目前的做法是:
zone_lst = df['ZZONE'].unique.tolist()
for z in zone_lst:
df_z_1 = df[(df['ZZONE']==z) & (df['ACTIVE'] == 1)].sample(frac = 0.5)
df_z_0 = df[(df['ZZONE']==z) & (df['ACTIVE'] == 0)].sample(frac = 0.5)
df_z_f = pd.concat([df_z_1,df_z_0],axis=0) # <--appending data
zone_lst=df['ZZONE'].unique.tolist()
对于区域内的z,请执行以下操作:
df_z_1=df[(df['ZZONE']=z)和(df['ACTIVE']=1)]。样本(分形=0.5)
df_z_0=df[(df['ZZONE']=z)和(df['ACTIVE']=0)]。样本(分形=0.5)
df_z_f=pd.concat([df_z_1,df_z_0],axis=0)#在自定义函数中与groupby
一起使用:
def func(x):
#count number of each value and return minimal what is passed to n parameter in sample
same = x['ACTIVE'].value_counts().min()
a = x[x['ACTIVE'] == 0].sample(same).index
b = x[x['ACTIVE'] == 1].sample(same).index
return df.loc[a.union(b)]
另一个想法是:
def func(x):
same = x['ACTIVE'].value_counts().min()
a = x[x['ACTIVE'] == 0].sample(same)
b = x[x['ACTIVE'] == 1].sample(same)
return a.append(b)
df = df.groupby('ZZONE').apply(func).reset_index(drop=True)
print (df)
ZZONE ZRET_QTY ZREQ_VAL ACTIVE
0 BLR 125 25.66 1
1 BLR 227 29.50 0
2 BOM 223 29.56 1
3 BOM 133 26.55 0
编辑:
或:
好的,所以你不认为如果BLR ZZONE有四对,比如分别有两个1和0,这将失败,因为OP说“存在相同数量的1和0”@iamklaus-yop,我为this@jezrael:太好了。如果我在sample
函数中使用不同的frac
会怎么样。假设对于ACTIVE
1,我使用sample(frac=0.6)
而对于ACTIVE
0,我使用sample(frac=0.4)
是的,我得到了相同的结果。事实上,我在我的案例中使用了a.append(b)
,然后我看到了您的编辑。非常感谢。非常感谢。如果其中还有一行具有zzone BLR和活动值0,那么输出应该是什么?输出将与上面所示的相同。我使用的sample
的frac=0.5,因此期望1和0的发生率相等
def func(x):
a = x[x['ACTIVE'] == 0].sample(frac = 0.4).index
b = x[x['ACTIVE'] == 1].sample(frac = 0.6).index
return df.loc[a.union(b)]
def func(x):
a = x[x['ACTIVE'] == 0].sample(frac = 0.4)
b = x[x['ACTIVE'] == 1].sample(frac = 0.6)
return a.append(b)
df = df.groupby('ZZONE').apply(func).reset_index(drop=True)
print (df)
ZZONE ZRET_QTY ZREQ_VAL ACTIVE
0 BLR 125 25.66 1
1 BOM 223 29.56 1