gpt4 book ai didi

python - 按列中的值对数据框进行采样并保留所有行

转载 作者:行者123 更新时间:2023-12-04 03:35:50 25 4
gpt4 key购买 nike

我想使用特定列中的值对 Pandas 数据框进行采样,但我想保留所有行都包含样本中的值。
例如,在下面的数据框中,我想随机采样 b 中值的一部分,但保留 全部 a 中的相应行和 c .

d = pd.DataFrame({'a': range(1, 101, 1),'b': list(range(0, 100, 4))*4, 'c' :list(range(0, 100, 2))*2} )
来自 16% 样本的所需示例输出:
Out[66]: 
a b c
0 1 0 0
1 26 0 50
2 51 0 0
3 76 0 50
4 4 12 6
5 29 12 56
6 54 12 6
7 79 12 56
8 18 68 34
9 43 68 84
10 68 68 34
11 93 68 84
12 19 72 36
13 44 72 86
14 69 72 36
15 94 72 86

我试过对系列进行采样并合并回主要数据,如下所示:
In [66]: pd.merge(d, d.b.sample(int(.16 * d.b.nunique())))
这会创建所需的输出,但似乎效率低下。我的真实数据集在 b 中有数百万个值和数亿行。我知道我也可以使用某些版本的“isin”,但这也很慢。
有没有更有效的方法来做到这一点?

最佳答案

我真的很怀疑 isin是缓慢的:

uniques = df.b.unique()

# this maybe the bottle neck
samples = np.random.choice(uniques, replace=False, size=int(0.16*len(uniques)) )

# sampling here
df[df.b.isin(samples)]
您可以分析上述步骤。万一 samples=...很慢,您可以尝试:
idx = np.random.rand(len(uniques))
samples = uniques[idx<0.16]
在我的系统上,在 1000 万行上花费了大约 100 毫秒。
备注 : d.b.sample(int(.16 * d.b.nunique()))不取样 0.16 b 中的唯一值.

关于python - 按列中的值对数据框进行采样并保留所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66936107/

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