gpt4 book ai didi

python - 基于每行类别的 Pandas 样本

转载 作者:行者123 更新时间:2023-11-28 22:09:02 30 4
gpt4 key购买 nike

假设我有一个 pandas 数据框

   rid category
0 0 c2
1 1 c3
2 2 c2
3 3 c3
4 4 c2
5 5 c2
6 6 c1
7 7 c3
8 8 c1
9 9 c3

我想添加 2 列 pid 和 nid,这样对于每一行,pid 包含一个与 rid 属于同一类别的随机 id(rid 除外),nid 包含一个与 rid 属于不同类别的随机 id ,

一个示例数据框是:

   rid category pid nid
0 0 c2 2 1
1 1 c3 7 4
2 2 c2 0 1
3 3 c3 1 5
4 4 c2 5 7
5 5 c2 4 6
6 6 c1 8 5
7 7 c3 9 8
8 8 c1 6 2
9 9 c3 1 2

请注意,pid 不应与 rid 相同。现在,我只是通过遍历行和每次采样来强制执行它,这看起来效率很低。

有更好的方法吗?

编辑 1:为简单起见,我们假设每个类别至少出现两次,这样至少可以找到一个没有删除但具有相同类别的 ID。

编辑 2: 为了更简单起见,我们假设在大型数据框中以与 rid 相同的 id 结束的概率为零。如果是这样,我相信解决方案应该更容易。不过,我不想做这个假设

最佳答案

对于 pid 列使用 Sattolo's algorithm并为 nid 获取所有可能的值,所有列的值与 numpy.random.choice 的组的值不同与设置的区别:

from random import randrange

#https://stackoverflow.com/questions/7279895
def sattoloCycle(items):
items = list(items)
i = len(items)
while i > 1:
i = i - 1
j = randrange(i) # 0 <= j <= i-1
items[j], items[i] = items[i], items[j]
return items

def outsideGroupRand(x):
return np.random.choice(list(set(df['rid']).difference(x)),
size=len(x),
replace=False)


df['pid1'] = df.groupby('category')['rid'].transform(sattoloCycle)
df['nid1'] = df.groupby('category')['rid'].transform(outsideGroupRand)
print (df)
rid category pid nid pid1 nid1
0 0 c2 2 1 4 6
1 1 c3 7 4 7 4
2 2 c2 0 1 5 3
3 3 c3 1 5 1 0
4 4 c2 5 7 2 9
5 5 c2 4 6 0 8
6 6 c1 8 5 8 3
7 7 c3 9 8 9 5
8 8 c1 6 2 6 5
9 9 c3 1 2 3 6

关于python - 基于每行类别的 Pandas 样本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57931505/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com