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