考虑数据帧:
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 后应用函数来确保这一点。我想避免这种情况。
这可能是一种方法。
- 创建具有唯一值的数组
'GT'
和'PRED'
列。它们可以使用独特的方法获得。 - 使用
numpy
随机播放来随机播放每个数组(这将为您提供随机性(。 - 使用随机数组创建数据帧
pairs
。此数组的每一行将是一对随机选择的'GT'
,并'PRED'
唯一值。 - 使用 pandas
apply
和一些布尔逻辑,搜索df2
中的哪些行具有有效的'GT'
和'PRED'
对,即pairs
数据帧中存在的一对。 - 仅从
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
。