我想随机选择二维数据帧的几列,并随机排列这些列中的值。我可以轻松地对数据帧的所有值(按列)进行洗牌,但我希望只对随机选择的几个值这样做。
例如,采用下面的 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)
然而,经过多次尝试,我无法将其修改为仅选择(随机)几列。 任何建议将不胜感激。谢谢你。
假设这个输入示例:
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
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