如何按其他组中不重复的唯一行进行分组和采样



我的数据帧包含三列:ID1ID2count。对于每个ID1值,有多个ID2值共享相同的计数。我的目标是为ID1随机选择一个唯一的ID2值,但由于一些ID1具有相同的计数,因此它们从相同的ID2组中进行选择,因此每个ID1与唯一的ID2不匹配。如何删除以前选择的ID2

df

index   ID1     cnt ID2
96333   48740   142 14145
96334   48740   142 23140
96335   48740   142 26850
96336   48740   142 159025
96349   148240  142 14145
96350   148240  142 23140
96351   148240  142 26850
96352   148240  142 159025

我当前的代码df.groupby("ID1").sample(n = 1, random_state = 5)创建了

index   ID1     cnt ID2
96333   48740   142 14145
96349   148240  142 14145

预期df

index   ID1     cnt ID2
96333   48740   142 14145
96352   148240  142 159025

一种解决方案是在数据帧中循环,删除选定的行,并使用更新后的df进行下一次采样,但如果df很大,则需要很长时间。

谢谢!

您可以在ID1/ID2上pivot并获得对角线。这将确保独特的组合。

然后根据cnt(如果需要(应用:

def unique(df):
idx = np.diagonal(df.pivot('ID1', 'ID2', 'index'))
return df[df['index'].isin(idx)]
out = unique(df)
# or per group
out = df.groupby('cnt', group_keys=False).apply(unique)

输出:

index     ID1  cnt    ID2
0  96333   48740  142  14145
5  96350  148240  142  23140

注意。使用上述函数,输出是确定性的,因为pivot对列进行排序。如果你想要一个随机输出,在得到对角线之前先打乱列

def unique(df):
idx = np.diagonal(df.pivot('ID1', 'ID2', 'index')
.sample(frac=1, axis=1))
return df[df['index'].isin(idx)]

最新更新