Python 在pandas中随机化/洗牌数据帧中的行

Python 在pandas中随机化/洗牌数据帧中的行,python,random,pandas,dataframe,shuffle,Python,Random,Pandas,Dataframe,Shuffle,我目前正试图找到一种方法,在数据框中按行随机排列项目。我在pandas()中的shuffling/permutation列方面发现了这个线程,但是出于我的目的,有没有一种方法可以像 import pandas as pd data = {'day': ['Mon', 'Tues', 'Wed', 'Thurs', 'Fri'], 'color': ['Blue', 'Red', 'Green', 'Yellow', 'Black'], 'Number': [11,

我目前正试图找到一种方法,在数据框中按行随机排列项目。我在pandas()中的shuffling/permutation列方面发现了这个线程,但是出于我的目的,有没有一种方法可以像

import pandas as pd

data = {'day': ['Mon', 'Tues', 'Wed', 'Thurs', 'Fri'],
       'color': ['Blue', 'Red', 'Green', 'Yellow', 'Black'],
       'Number': [11, 8, 10, 15, 11]}

dataframe = pd.DataFrame(data)
    Number   color    day
0      11    Blue    Mon
1       8     Red   Tues
2      10   Green    Wed
3      15  Yellow  Thurs
4      11   Black    Fri
并将这些行随机分成类似的

    Number   color    day
0      Mon    Blue    11
1      Red    Tues     8
2      10     Wed    Green
3      15    Yellow  Thurs
4      Black   11     Fri
我理解,如果要这样做,列标题必须消失或类似的东西

编辑:所以,在我发布的线程中,部分代码引用了“axis”参数。我知道axis=0表示列,axis=1表示行。我尝试使用代码并将轴更改为1,但似乎只有当表包含所有数字时(与字符串列表或两者的组合相反),数据帧才会随机化


< >我应该考虑不使用数据帧吗?如果我的数据只包含字符串或整数和字符串的组合,是否有更好的二维结构可以随机化行和列?

可能会将二维数组展平,然后进行无序排列

In [21]: data2=dataframe.values.flatten()

In [22]: np.random.shuffle(data2)

In [23]: dataframe2=pd.DataFrame (data2.reshape(dataframe.shape), columns=dataframe.columns )

In [24]: dataframe2
Out[24]: 
  Number   color    day
0   Tues  Yellow     11
1    Red   Green    Wed
2  Thurs     Mon   Blue
3     15       8  Black
4    Fri      11     10

编辑:我误解了这个问题,它只是为了洗牌行而不是所有的表(对吗?)

我认为使用数据帧没有多大意义,因为列名变得毫无用处。因此,您可以只使用2D numpy阵列:

In [1]: A
Out[1]: 
array([[11, 'Blue', 'Mon'],
       [8, 'Red', 'Tues'],
       [10, 'Green', 'Wed'],
       [15, 'Yellow', 'Thurs'],
       [11, 'Black', 'Fri']], dtype=object)

In [2]: _ = [np.random.shuffle(i) for i in A] # shuffle in-place, so return None

In [3]: A
Out[3]: 
array([['Mon', 11, 'Blue'],
       [8, 'Tues', 'Red'],
       ['Wed', 10, 'Green'],
       ['Thurs', 15, 'Yellow'],
       [11, 'Black', 'Fri']], dtype=object)
如果要保留数据帧:

In [4]: pd.DataFrame(A, columns=data.columns)
Out[4]: 
  Number  color     day
0    Mon     11    Blue
1      8   Tues     Red
2    Wed     10   Green
3  Thurs     15  Yellow
4     11  Black     Fri

这里有一个用于洗牌行和列的函数:

import numpy as np
import pandas as pd

def shuffle(df):
    col = df.columns
    val = df.values
    shape = val.shape
    val_flat = val.flatten()
    np.random.shuffle(val_flat)
    return pd.DataFrame(val_flat.reshape(shape),columns=col)

In [2]: data
Out[2]: 
   Number   color    day
0      11    Blue    Mon
1       8     Red   Tues
2      10   Green    Wed
3      15  Yellow  Thurs
4      11   Black    Fri

In [3]: shuffle(data)
Out[3]: 
  Number  color     day
0    Fri    Wed  Yellow
1  Thurs  Black     Red
2  Green   Blue      11
3     11      8      10
4    Mon   Tues      15

希望这对@jrjc的答案有所帮助,我已经发布了使用
np.apply\u沿轴()


查看完整答案,了解如何将其与Pandas df集成。

因此,我从来都不知道扁平化(我发现这非常有用,谢谢!),但目前我尝试的是在一行内对每行进行随机化。下一步是在一列中随机化,但行位首先让我感到不安。您的代码会随机移动,但不会按行移动=/.FYI,您应该使用
.ravel()
而不是
.flatte()
,因为flatten总是复制(只有在必要时才使用ravel)谢谢@Jeff。顺便说一句,在这种情况下,我猜
.ravel()
也会由于不同的
数据类型而复制?在这种情况下,它会复制两次<代码>展平
始终进行复制,
仅当无法创建视图时才进行展平
。在本例中,
ravel
看到的是一个
对象
dtypes数组,它可能可以查看该数组(这取决于numpy)。在这种情况下,它可能在任何情况下都不会有太大的区别。与Happy001的帖子类似,我很感谢它的扁平化,因为它有助于我在项目中的未来计划,但我需要按行洗牌/随机化。@user3010693,对不起,我误解了,我编辑了答案。告诉我它是否适合你的需要。这就是我要找的。谢谢注意:Zelazny7的答案(或者可能是我关于使用iloc的评论)是IMO best bet.oops,因为它明显不同而重新打开。想知道你为什么要这么做!嗯,我正在为一个实验创建一个随机发生器。为了适当地平衡,我希望能够独立地对行和列进行随机化,但是表中的数据并不都是整数,而是字符串、字典等的列表。也就是说,我试图找出是否有一种方法可以基本上完成我发布的链接中所做的事情(按列随机排列),并将其应用于行。我能够做到这一点,但前提是数据帧只包含数字,尽管我想将这种可能性扩展到字符串之类的东西。仅仅洗牌整个值不是“更随机”吗?(啊,哈,这是公认的答案:太好了!)
a = np.array([[10, 11, 12], [20, 21, 22], [30, 31, 32],[40, 41, 42]])
print(a)
[[10 11 12]
 [20 21 22]
 [30 31 32]
 [40 41 42]]

print(np.apply_along_axis(np.random.permutation, 1, a))
[[11 12 10]
 [22 21 20]
 [31 30 32]
 [40 41 42]]