【问题标题】:Randomizing/Shuffling rows in a dataframe in pandas在熊猫数据框中随机化/改组行
【发布时间】:2014-09-02 06:50:15
【问题描述】:

我目前正在尝试找到一种方法来按行随机化数据框中的项目。我在 pandas (shuffling/permutating a DataFrame in pandas) 中发现了这个线程,关于 shuffle/permutation column-wise,但出于我的目的,有没有办法做类似的事情

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 = 0 指的是列,axis = 1 指的是行。我尝试获取代码并将轴更改为 1,并且似乎只有当表包含所有数字(而不是字符串列表或两者的组合)时才会随机化我的数据框。

也就是说,我应该考虑不使用数据框吗?如果我的数据仅包含字符串或整数和字符串的组合,是否有更好的 2D 结构可以随机化行和列?

【问题讨论】:

  • 注意:Zelazny7 的回答 stackoverflow.com/a/15772330/1240268(或者可能是我对使用 iloc 的评论)是 IMO 的最佳选择。
  • 哎呀,重新打开,因为它明显不同。有兴趣了解为什么您想这样做!
  • 好吧,我正在为实验创建某种随机化器。为了适当地平衡,我希望能够彼此独立地随机化行和列,但表中的数据并不都是整数,而是字符串列表、字典等。也就是说,我试图找出是否有一种方法可以基本上完​​成我发布的链接中所做的事情(按列随机化)并将其应用于行。我能够完成这项工作,但前提是数据框仅包含数字,尽管我想将可能性扩展到字符串等。
  • 只是洗牌整个值不是“更随机”吗? (啊,这是公认的答案:太好了!)

标签: python random pandas dataframe shuffle


【解决方案1】:

编辑:我误解了这个问题,这只是洗牌而不是整张桌子(对吗?)

我认为使用数据框没有多大意义,因为列名变得毫无用处。所以你可以只使用 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

希望对你有帮助

【讨论】:

  • 与 Happy001 的帖子类似,我很感谢 flatten 位,因为它有助于我在项目中的未来计划,但我需要按行随机化/随机化。
  • @user3010693,对不起,我误解了,我编辑了答案。告诉我它是否符合您的需求。
  • 这就是我要找的。谢谢!
【解决方案2】:

也许展平二维数组然后洗牌?

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

【讨论】:

  • 所以,我从来不知道扁平化(我觉得它非常有用,谢谢!),但目前我正在尝试的是在每一行的一行内随机化。下一步将是在一列内随机化,但行位首先让我感到不安。您的代码会随机播放,但不会按行播放 =/.
  • 仅供参考,您应该使用.ravel() 而不是.flatten() 作为展平始终副本(仅在必要时散列)
  • 谢谢,@Jeff。顺便说一句,在这种情况下,我猜.ravel() 也由于不同的dtypes 而复制?
  • 在这种情况下它被复制了两次flatten 总是 复制,ravel 仅当它无法创建视图时。在这种情况下,ravel 看到了一个 object dtypes 数组,它可能能够查看(这取决于 numpy)。无论如何,在这种情况下,它可能没有太大的区别。
【解决方案3】:

基于@jrjc 的回答,我发布了使用np.apply_along_axis()https://stackoverflow.com/a/44686455/5009287

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]]

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

【讨论】:

    猜你喜欢
    • 2015-04-17
    • 1970-01-01
    • 2020-12-09
    • 2016-06-04
    • 2020-11-09
    • 2021-03-14
    • 1970-01-01
    • 2017-02-22
    • 2018-06-04
    相关资源
    最近更新 更多