【问题标题】:Shuffle DataFrame rows except the first row随机播放除第一行以外的 DataFrame 行
【发布时间】:2016-05-31 22:23:31
【问题描述】:

我正在尝试随机化数据框中的所有行,但第一行除外。我希望第一行总是首先出现,其余行可以是任何随机顺序。

我的数据框是:

 df = pd.DataFrame(np.random.randn(10, 5), columns=['a', 'b', 'c', 'd', 'e'])

关于如何解决这个问题有什么建议吗?

【问题讨论】:

    标签: python pandas numpy dataframe shuffle


    【解决方案1】:

    试试这个:

    df = pd.concat([df[:1], df[1:].sample(frac=1)]).reset_index(drop=True)
    

    测试:

    In [38]: df
    Out[38]:
              a         b         c         d         e
    0  2.070074  2.216060 -0.015823  0.686516 -0.738393
    1 -1.213517  0.994057  0.634805  0.517844 -0.128375
    2  0.937532  0.814923 -0.231120  1.970019  1.438927
    3  1.499967  0.105707  1.255207  0.929084 -3.359826
    4  0.418702 -0.894226 -1.088968  0.631398  0.152026
    5  1.214119 -0.122633  0.983818 -0.445202 -0.807955
    6  0.252078 -0.258703 -0.445209 -0.179094  1.180077
    7  1.428827 -0.569009 -0.718485  0.161108  1.300349
    8 -1.403100  2.154548 -0.492264 -0.544538 -0.061745
    9  0.468671  0.004839 -0.738240 -0.385624 -0.532640
    
    In [39]: df = pd.concat([df[:1], df[1:].sample(frac=1)]).reset_index(drop=True)
    
    In [40]: df
    Out[40]:
              a         b         c         d         e
    0  2.070074  2.216060 -0.015823  0.686516 -0.738393
    1  0.468671  0.004839 -0.738240 -0.385624 -0.532640
    2  0.418702 -0.894226 -1.088968  0.631398  0.152026
    3 -1.213517  0.994057  0.634805  0.517844 -0.128375
    4  1.428827 -0.569009 -0.718485  0.161108  1.300349
    5  0.937532  0.814923 -0.231120  1.970019  1.438927
    6  0.252078 -0.258703 -0.445209 -0.179094  1.180077
    7  1.499967  0.105707  1.255207  0.929084 -3.359826
    8 -1.403100  2.154548 -0.492264 -0.544538 -0.061745
    9  1.214119 -0.122633  0.983818 -0.445202 -0.807955
    

    【讨论】:

    • 不错的解决方案!使用.sample(frac=1) 似乎更干净一些,并且对我来说执行得稍微快一些,尽管差异很小,可能并不重要。
    • @root,是的,确实 - 谢谢你的提示!我已经相应地更新了答案
    • 感谢您提供此解决方案。实际上,我在发布问题后开始查看pd.concat,所以很高兴知道我开始走上正确的道路。
    • @Dan,请注意 piRSquared 的解决方案——我比我更喜欢它
    • 两者都很好。
    【解决方案2】:

    使用numpyshuffle

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame(np.arange(100).reshape(20, 5), columns=list('ABCDE'))
    
    np.random.shuffle(df.values[1:, :])
    print df
    
         A   B   C   D   E
    0    0   1   2   3   4
    1   55  56  57  58  59
    2   10  11  12  13  14
    3   80  81  82  83  84
    4   90  91  92  93  94
    5   70  71  72  73  74
    6   25  26  27  28  29
    7   40  41  42  43  44
    8   65  66  67  68  69
    9    5   6   7   8   9
    10  45  46  47  48  49
    11  85  86  87  88  89
    12  15  16  17  18  19
    13  30  31  32  33  34
    14  60  61  62  63  64
    15  20  21  22  23  24
    16  35  36  37  38  39
    17  95  96  97  98  99
    18  75  76  77  78  79
    19  50  51  52  53  54
    

    np.random.shufflendarray 改组到位。 dataframe 只是 ndarray 的包装。您可以使用 values 属性访问该 ndarray。要指定除第一行以外的所有内容都被改组,请对数组切片 [1:, :] 进行操作。

    【讨论】:

      猜你喜欢
      • 2015-06-17
      • 2023-03-28
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多