我有一个名为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]
字符串最后一行代码无限期挂起。有更好的办法吗?
7vhp5slm1#
很难确切地知道发生了什么,但我怀疑这是sample的错误使用和重复索引的结合。为什么要sample行,然后获取输出的索引,然后用它再次切片原始数据框?我们来看看会出什么差错。sample已经提供了一个DataFrame。再次索引是无用的:
sample
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行。对于大输入来说,这是相当大的,并且可能是超时的原因:
n
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
型
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 上使用。
sel_idx
syqv5f0l3#
尝试:
sample = df.sample(n=5) # <-- number of random rows you want
字符串或者如果你想按百分比计算:
sample = df.sample(frac=0.1)
型这对我很有效😀
xdyibdwo4#
我假设您只想返回1行(但是随机行)
random_row = X_it.tail(42).head(1) # replace 42 with random number derived however you want
字符串如果你想返回一行以上,只需相应地增加.head中的值。
4条答案
按热度按时间7vhp5slm1#
很难确切地知道发生了什么,但我怀疑这是
sample
的错误使用和重复索引的结合。为什么要
sample
行,然后获取输出的索引,然后用它再次切片原始数据框?我们来看看会出什么差错。
sample
已经提供了一个DataFrame。再次索引是无用的:字符串
第二步显然是无用的,但没有造成太大的伤害。
现在我们假设输入中有重复的索引:
型
如果我们只是
sample
,一切都很好:型
但是如果我们从那里索引,现在它是坏的,所有行被选择的次数与有重复的次数一样多。在本例中,对于采样中间体中的
n
行,您将得到n**2行。对于大输入来说,这是相当大的,并且可能是超时的原因:型
gcxthw6b2#
因此,正如你在评论中所说,你必须将相同的随机选择应用到另一个数据框架,直接使用numpy构建索引列表会更有效。这为您省去了使用pandas索引的不必要的弯路。
字符串
这个
sel_idx
可以直接在第二个 Dataframe 上使用。syqv5f0l3#
尝试:
字符串
或者如果你想按百分比计算:
型
这对我很有效😀
xdyibdwo4#
我假设您只想返回1行(但是随机行)
字符串
如果你想返回一行以上,只需相应地增加.head中的值。