从数据帧中选取随机值,以便生成的数据帧在 python-pandas 中的两列中是唯一的



考虑数据帧:

data = [['G1','P1',0.3], ['G1','P2',0.3], ['G1','P3',0.3],['G2','P1',0.3],['G2','P2',0.3],['G3','P2',0.3]] 
df2 = pd.DataFrame(data, columns = ['GT', 'PRED','ACC']) 

DF2 看起来像这样:

GT  PRED    ACC
0   G1  P1      0.3
1   G1  P2      0.3
2   G1  P3      0.3
3   G2  P1      0.3
4   G2  P2      0.3
5   G3  P2      0.3

目标是选择随机行,以便唯一地选择 GT 和 PRED 中的值。 从其他堆栈溢出搜索中,我有以下代码:

size = 1        # sample size
replace = False # with replacement
fn = lambda obj: obj.loc[np.random.choice(obj.index, size, replace),:]
pt = df2.groupby('PRED', as_index=False).apply(fn)

其输出为

GT  PRED    ACC
0   G1  P1      0.3
1   G1  P2      0.3
2   G1  P3      0.3

我的预期输出应该是

GT  PRED    ACC
0   G1  P3      0.3
1   G2  P1      0.3
2   G3  P2      0.3

也就是说,在过滤时,我们正在确保GT和PRED是唯一的。我可以通过在 for 循环中生成 df 后应用函数来确保这一点。我想避免这种情况。

这可能是一种方法。

  1. 创建具有唯一值的数组'GT''PRED'列。它们可以使用独特的方法获得。
  2. 使用numpy随机播放来随机播放每个数组(这将为您提供随机性(。
  3. 使用随机数组创建数据帧pairs。此数组的每一行将是一对随机选择的'GT',并'PRED'唯一值。
  4. 使用 pandasapply和一些布尔逻辑,搜索df2中的哪些行具有有效的'GT''PRED'对,即pairs数据帧中存在的一对。
  5. 仅从df2中选择这些行以获取输出。

翻译成工作代码,这是:

gt_u = df2['GT'].unique()
pred_u = df2['PRED'].unique()
np.random.shuffle(gt_u)
np.random.shuffle(pred_u)
pairs = pd.DataFrame({'GT':gt_u, 'PRED':pred_u})    
#pairs = pd.DataFrame([[x, y] for x, y in zip(gt_u, pred_u)], columns=['GT', 'PRED'])
sel = df2.apply(lambda x : (x[['GT', 'PRED']] == pairs).all(axis=1).any(axis=0), axis=1)
out = df2.loc[sel]

注意:如果您不确定唯一数组的长度是否相等,请使用注释行生成pairs

最新更新