从数据帧中选取随机值,以使生成的数据帧在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'
唯一值
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的所有可能组合。使用纯随机选择可能会错过一些有效的组合。你同意吗?是的,没错