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

Har*_*nna 1 python pandas

我想通过从其余列中随机采样数据来创建新列。

考虑具有“ N”列的数据框,如下所示:

|---------------------|------------------|---------------------|
|      Column 1       |     Column 2     |      Column N       |
|---------------------|------------------|---------------------|
|          0.37       |         0.8      |          0.0        |
|---------------------|------------------|---------------------|
|          0.0        |         0.0      |          0.8        |
|---------------------|------------------|---------------------|
Run Code Online (Sandbox Code Playgroud)

结果数据框应如下所示

|---------------------|------------------|---------------------|---------------|
|      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      |
|---------------------|------------------|---------------------|---------------|
Run Code Online (Sandbox Code Playgroud)

通过随机选择“ N”列的相应条目之一来创建“已采样”列的条目。例如,从第2列中选择“ 0.8”,从第N列中选择“ B”,依此类推。

df.sample(axis=1)只需选择一列并返回它。这不是我想要的。

实现这一目标的最快方法是什么?该方法必须高效,因为原始数据帧很大,有很多行和列。

use*_*203 5

您可以使用基础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])
Run Code Online (Sandbox Code Playgroud)

  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
Run Code Online (Sandbox Code Playgroud)


WeN*_*Ben 5

熊猫基地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
Run Code Online (Sandbox Code Playgroud)