如何有效地从大型Pandas Dataframe中采样?

h4cxqtbf  于 2023-08-01  发布在  其他
关注(0)|答案(4)|浏览(99)

我有一个名为X_it的数据框架,具有形状(2667913,42)
我试图通过使用下面的代码从数据框架中采样:

import numpy as np

np.random.seed(42)

sel_idx = X_it.sample(frac=0.1).index

X = X_it.loc[sel_idx]

字符串
最后一行代码无限期挂起。有更好的办法吗?

7vhp5slm

7vhp5slm1#

很难确切地知道发生了什么,但我怀疑这是sample的错误使用和重复索引的结合。
为什么要sample行,然后获取输出的索引,然后用它再次切片原始数据框?
我们来看看会出什么差错。
sample已经提供了一个DataFrame。再次索引是无用的:

df = pd.DataFrame({'A': range(10),
                   'B': range(10)})
print(df)

   A  B
0  0  0
1  1  1
2  2  2
3  3  3
4  4  4
5  5  5
6  6  6
7  7  7
8  8  8
9  9  9

# now let's sample
out = df.sample(frac=0.3)
print(out)

   A  B
9  9  9
1  1  1
0  0  0

# now let's index again
print(out.loc[out.index])

   A  B
9  9  9
1  1  1
0  0  0

字符串
第二步显然是无用的,但没有造成太大的伤害。

现在我们假设输入中有重复的索引

A  B
0  0  0
0  1  1
0  2  2
0  3  3
0  4  4
0  5  5
0  6  6
0  7  7
0  8  8
0  9  9


如果我们只是sample,一切都很好:

out = df.sample(frac=0.3)
print(out)

   A  B
0  5  5
0  9  9
0  2  2


但是如果我们从那里索引,现在它是坏的,所有行被选择的次数与有重复的次数一样多。在本例中,对于采样中间体中的n行,您将得到n**2行。对于大输入来说,这是相当大的,并且可能是超时的原因:

print(out.loc[out.index])
   A  B
0  5  5
0  9  9
0  2  2
0  5  5
0  9  9
0  2  2
0  5  5
0  9  9
0  2  2

gcxthw6b

gcxthw6b2#

因此,正如你在评论中所说,你必须将相同的随机选择应用到另一个数据框架,直接使用numpy构建索引列表会更有效。这为您省去了使用pandas索引的不必要的弯路。

import numpy as np

np.random.seed(42)

sample_size = int(0.1 * len(X_it))
sel_idx = np.random.choice(X_it.index, size=sample_size, replace=False)

X = X_it.loc[sel_idx]

字符串
这个sel_idx可以直接在第二个 Dataframe 上使用。

syqv5f0l

syqv5f0l3#

尝试:

sample = df.sample(n=5) # <-- number of random rows you want

字符串
或者如果你想按百分比计算:

sample = df.sample(frac=0.1)


这对我很有效😀

xdyibdwo

xdyibdwo4#

我假设您只想返回1行(但是随机行)

random_row = X_it.tail(42).head(1) # replace 42 with random number derived however you want

字符串
如果你想返回一行以上,只需相应地增加.head中的值。

相关问题