Python 在pandas中随机化/洗牌数据帧中的行
我目前正试图找到一种方法,在数据框中按行随机排列项目。我在pandas()中的shuffling/permutation列方面发现了这个线程,但是出于我的目的,有没有一种方法可以像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,
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]]