Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从数据帧中选取随机值,以使生成的数据帧在python中的两列中是唯一的_Python_Pandas - Fatal编程技术网

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

从数据帧中选取随机值,以使生成的数据帧在python中的两列中是唯一的,python,pandas,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

以数据帧为例:

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-a循环中生成df之后应用函数来确保这一点。我想避免这样

这可能是一种方法

  • 使用
    'GT'
    'PRED'
    列的唯一值创建数组。可以使用该方法获得它们
  • 使用
    numpy
    洗牌每个数组(这将给你随机性)
  • 使用乱序数组创建数据帧
    对。此数组的每一行将是一对随机选择的
    'GT'
    'PRED'
    唯一值
  • 使用pandas
    apply
    和一些布尔逻辑,搜索
    df2
    中哪些行具有有效的
    'GT'
    'PRED'
    对,即
    对中存在的对
  • 仅从
    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]
    

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

    df2.groupby(['GT','PRED'],as_index=False)。apply(fn)
    ?无效。这将无法确保GT和PRED各自是唯一的。G2将在结果中出现两次原始df没有GT和PRED的所有可能组合。使用纯随机选择可能会错过一些有效的组合。你同意吗?是的,没错