随机选择要对二维数据框进行洗牌的列

问题描述 投票:0回答:2

我想随机选择二维数据帧的几列,并随机排列这些列中的值。我可以轻松地对数据帧的所有值(按列)进行洗牌,但我希望只对随机选择的几个值这样做。

例如,采用下面的 6x6 数据框:


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

随机选择 6 列中的几列,注意以下输出:

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

上图显示第一、第二和最后一列已打乱顺序,其他所有保持原样。

以下代码允许我随机排列所有列:

import numpy as np
df = np.random.random((6,6))
np.random.random(df)

然而,经过多次尝试,我无法将其修改为仅选择(随机)几列。 任何建议将不胜感激。谢谢你。

dataframe numpy random shuffle type-2-dimension
2个回答
0
投票

假设这个输入示例:

import numpy as np
df = pd.DataFrame(np.arange(4*5).reshape(4, 5, order='F'))

   0  1   2   3   4
0  0  4   8  12  16
1  1  5   9  13  17
2  2  6  10  14  18
3  3  7  11  15  19

我会用:

import numpy as np

# pick 3 random columns
cols = np.random.choice(df.columns, 3, replace=False)

# shuffle them independently
df[cols] = df[cols].apply(lambda s: np.random.choice(s, len(s), replace=False))

输出示例:

   0  1   2   3   4
0  1  4  11  14  16
1  0  5   8  15  17
2  3  6  10  13  18
3  2  7   9  12  19

0
投票

IIUC,

import pandas as pd
import numpy as np

df = pd.DataFrame(np.arange(36).reshape(6,-1, order='F'), columns=[*'ABCDEF'])
cols_shuf = np.random.choice(df.columns, 3, replace=False)

df.assign(**df[cols_shuf].apply(lambda x: x.sample(frac=1).to_numpy()))

输出:

   A   B   C   D   E   F
0  2   6  15  18  28  30
1  1   7  16  19  27  31
2  0   8  17  20  29  32
3  3   9  14  21  25  33
4  5  10  12  22  26  34
5  4  11  13  23  24  35
© www.soinside.com 2019 - 2024. All rights reserved.