我的数据帧包含三列:ID1
、ID2
、count
。对于每个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)]