为了账号安全,请及时绑定邮箱和手机立即绑定

通过随机抽样其他列数据创建新列

通过随机抽样其他列数据创建新列

守着星空守着你 2022-01-05 11:03:33
我想通过从其余列中随机采样数据来创建一个新列。考虑一个带有“N”列的数据框,如下所示:|---------------------|------------------|---------------------||      Column 1       |     Column 2     |      Column N       ||---------------------|------------------|---------------------||          0.37       |         0.8      |          0.0        ||---------------------|------------------|---------------------||          0.0        |         0.0      |          0.8        ||---------------------|------------------|---------------------|结果数据框应该看起来像|---------------------|------------------|---------------------|---------------||      Column 1       |     Column 2     |      Column N       |     Sampled   ||---------------------|------------------|---------------------|---------------||          0.37       |         0.8      |          0.0        |       0.8     ||---------------------|------------------|---------------------|---------------||          0.0        |         0.0      |          B          |        B      ||---------------------|------------------|---------------------|---------------||          A          |         5        |          0.8        |        A      ||---------------------|------------------|---------------------|---------------|“Sampled”列的条目是通过随机选择“N”列的相应条目之一来创建的。例如,从第 2 列中选择“0.8”,从第 N 列中选择“B”,依此类推。df.sample(axis=1)只需选择一列并返回它。这不是我想要的。实现这一目标的最快方法是什么?该方法需要高效,因为原始数据框很大,有很多行和列。
查看完整描述

3 回答

?
Helenr

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


查看完整回答
反对 回复 2022-01-05
?
胡说叔叔

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


查看完整回答
反对 回复 2022-01-05
?
紫衣仙女

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)


查看完整回答
反对 回复 2022-01-05
  • 3 回答
  • 0 关注
  • 151 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信