在pandas中随机化/打乱数据框的行

4 投票
3 回答
10766 浏览
提问于 2025-04-18 12:57

我现在想找个方法,把数据表中的每一行随机打乱。我在网上找到一个关于在pandas中按列打乱数据表的讨论(在pandas中打乱数据表),但我想知道有没有办法像这样

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,结果发现只有当表格全是数字时,它才会随机打乱我的数据表(如果是字符串列表,或者数字和字符串的组合就不行)。

那么,我是不是应该考虑不使用数据表?有没有更好的二维结构,可以让我在数据全是字符串或者是数字和字符串的组合时,随机打乱行和列呢?

3 个回答

1

在@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数据框结合使用的。

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
4

编辑:我之前误解了问题,实际上只是想打乱行,而不是整个表格,对吧?

我觉得使用数据框(dataframe)没什么太大意义,因为列名变得没用了。所以你可以直接使用二维的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

希望这能帮到你

撰写回答