3 回答
TA贡献1780条经验 获得超4个赞
您可以使用底层numpy数组并为每行选择一个随机索引。
u = df.values
r = np.random.randint(0, u.shape[1], u.shape[0])
df.assign(Sampled=u[np.arange(u.shape[0]), r])
Column 1 Column 2 Column N Sampled
0 0.37 0.8 0.0 0.37
1 0.0 0.0 B B
2 A 5.0 0.8 A
TA贡献1804条经验 获得超8个赞
熊猫基地lookup+sample
s=df.columns.to_series().sample(len(df),replace = True)
df['New']=df.lookup(df.index,s)
df
Out[177]:
Column1 Column2 ColumnN New
0 0.37 0.8 0.0 0.8
1 0.0 0.0 B B
2 A 5.0 0.8 A
TA贡献1839条经验 获得超15个赞
一种选择是apply np.random.choice沿着行到数据框。这可能会也可能不会为您提供所需的性能,但我让您自行决定
设置:DF 4 列 11000 行
df=pd.DataFrame({'a':[np.random.rand() for i in range(11000)],'b':[np.random.rand() for i in range(11000)],
'c':[np.random.rand() for i in range(11000)],'d':[np.random.rand() for i in range(11000)]})
%timeit df['e']=df.apply(lambda x: np.random.choice(x), axis=1)
193 ms ± 28 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
其他基准:
添加x.values到 lambda 中似乎可以将速度提高大约 20%。但是,@wen-ben 的解决方案是在同一数据帧上将此方法改进了 100 倍
1.91 ms ± 155 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
根据要求,这里是 user3483203 的答案的时间,可能会更好(我不得不对它做一些事情以使其与时间魔法一起工作,所以 ymmv)
%%timeit
df1=df.copy()
u = df.values
r = np.random.randint(0, u.shape[1], u.shape[0])
df1=df1.assign(Sampled=u[np.arange(u.shape[0]), r])
590 µs ± 37 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
添加回答
举报