按列中的值对数据框进行采样并保留所有行
Sample dataframe by value in column and keep all rows
我想使用特定列中的值对 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()))
不对b
.
中的唯一值进行采样0.16
我想使用特定列中的值对 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()))
不对b
.
0.16