我想知道如何将指定的"矩形"中的值随意移动到位。 DataFrame中的值。例如,假设我想要将由列4到7和行12到18(包括第4和第7行)定义的数据矩形中的值进行混洗。我们的想法是对这些单元格中的值进行加扰,而不会影响矩形外的值。
答案 0 :(得分:0)
您可以在基础NumPy数组上使用numpy.random.shuffle()
:
通过改组其内容来就地修改序列。
df = pd.DataFrame(np.arange(20).reshape(5, 4))
np.random.shuffle(df.values[1:3, 1:3])
df # see [[9, 10], [5, 6]]
0 1 2 3
0 0 1 2 3
1 4 9 10 7
2 8 5 6 11
3 12 13 14 15
4 16 17 18 19
答案 1 :(得分:0)
一种方法是将sample
与frac=1
一起使用,首先我“切片”我的数据帧以仅获取我正在加扰的形状,然后将该数据帧切片重新整形为1-D,然后使用100%分数调用样本方法,并重新整形回原始数据并复制回原始数据框:
df = pd.DataFrame(np.arange(100).reshape(5,-1))
print(df)
输入df:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
1 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
2 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
3 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
4 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
#Shuffle first region columns 4 to 7
df.iloc[:, 4:8] = (df.iloc[:,4:8].stack().sample(frac=1)
.set_axis(df.iloc[:, 4:8].stack().index, inplace=False)
.unstack())
#Shuffle second region columns 12 to 18
df.iloc[:, 12:19] = (df.iloc[:,12:19].stack().sample(frac=1)
.set_axis(df.iloc[:, 12:19].stack().index, inplace=False)
.unstack())
print(df)
输出df:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
0 0 1 2 3 7 47 65 46 8 9 10 11 18 75 32 73 34 56 37 19
1 20 21 22 23 66 24 4 67 28 29 30 31 92 55 54 97 76 93 74 39
2 40 41 42 43 26 45 27 25 48 49 50 51 12 17 16 38 98 57 96 59
3 60 61 62 63 86 84 6 5 68 69 70 71 14 78 15 53 77 35 94 79
4 80 81 82 83 85 64 87 44 88 89 90 91 95 33 36 52 13 58 72 99