随机数据帧行

时间:2015-04-11 09:47:58

标签: python pandas dataframe permutation shuffle

我有以下DataFrame:

    Col1  Col2  Col3  Type
0      1     2     3     1
1      4     5     6     1
...
20     7     8     9     2
21    10    11    12     2
...
45    13    14    15     3
46    16    17    18     3
...

从csv文件中读取DataFrame。所有包含Type 1的行都在顶部,其次是Type 2的行,然后是Type 3的行等等。

我想要改变DataFrame行的顺序,以便所有Type混合使用。可能的结果可能是:

    Col1  Col2  Col3  Type
0      7     8     9     2
1     13    14    15     3
...
20     1     2     3     1
21    10    11    12     2
...
45     4     5     6     1
46    16    17    18     3
...

我怎样才能做到这一点?

11 个答案:

答案 0 :(得分:530)

使用pandas执行此操作的更惯用方法是使用数据框的.sample方法,即

df.sample(frac=1)

frac关键字参数指定随机样本中要返回的行的分数,因此frac=1表示返回所有行(按随机顺序)。

注意: 如果您希望就地对数据帧进行随机播放并重置索引,可以这样做。

df = df.sample(frac=1).reset_index(drop=True)

在此处,指定drop=True会阻止.reset_index创建包含旧索引条目的列。

答案 1 :(得分:144)

您可以直接使用sklearn

from sklearn.utils import shuffle
df = shuffle(df)

答案 2 :(得分:48)

您可以通过使用混洗索引进行索引来对数据帧的行进行随机播放。为此,您可以使用np.random.permutation(但np.random.choice也是可能的):

In [12]: df = pd.read_csv(StringIO(s), sep="\s+")

In [13]: df
Out[13]: 
    Col1  Col2  Col3  Type
0      1     2     3     1
1      4     5     6     1
20     7     8     9     2
21    10    11    12     2
45    13    14    15     3
46    16    17    18     3

In [14]: df.iloc[np.random.permutation(len(df))]
Out[14]: 
    Col1  Col2  Col3  Type
46    16    17    18     3
45    13    14    15     3
20     7     8     9     2
0      1     2     3     1
1      4     5     6     1
21    10    11    12     2

如果您希望保持索引编号为1,2,..,n,如示例所示,您只需重置索引:df_shuffled.reset_index(drop=True)

答案 3 :(得分:29)

TL; DR np.random.shuffle(ndarray)可以完成这项工作 所以,在你的情况下

np.random.shuffle(DataFrame.values)
引言下的

DataFrame使用NumPy ndarray作为数据持有者。 (您可以从DataFrame source code

查看

因此,如果使用np.random.shuffle(),它将沿着多维数组的第一轴对数组进行混洗。但是DataFrame的索引仍然没有改变。

尽管如此,还是有一些要考虑的问题。

  • 函数返回none。如果您想保留原始对象的副本,则必须在传递给函数之前执行此操作。
  • sklearn.utils.shuffle(),正如用户tj89建议的那样,可以指定random_state以及另一个控制输出的选项。你可能想要开发目的。
  • sklearn.utils.shuffle()更快。但是会将DataFrame的轴信息(索引,列)与它包含的ndarray一起收回。

基准测试结果

sklearn.utils.shuffle()np.random.shuffle()之间。

ndarray

nd = sklearn.utils.shuffle(nd)

0.10793248389381915秒快8倍

np.random.shuffle(nd)

0.8897626010002568秒

数据帧

df = sklearn.utils.shuffle(df)

0.3183923360193148秒快3倍

np.random.shuffle(df.values)

0.9357550159329548秒

  

结论:如果可以将轴信息(索引,列)与ndarray一起洗牌,请使用sklearn.utils.shuffle()。否则,请使用np.random.shuffle()

使用了代码

import timeit
setup = '''
import numpy as np
import pandas as pd
import sklearn
nd = np.random.random((1000, 100))
df = pd.DataFrame(nd)
'''

timeit.timeit('nd = sklearn.utils.shuffle(nd)', setup=setup, number=1000)
timeit.timeit('np.random.shuffle(nd)', setup=setup, number=1000)
timeit.timeit('df = sklearn.utils.shuffle(df)', setup=setup, number=1000)
timeit.timeit('np.random.shuffle(df.values)', setup=setup, number=1000)

答案 4 :(得分:10)

(我没有足够的声誉在最高职位上对此发表评论,所以我希望其他人可以为我做到这一点。)有人担心第一种方法:

df.sample(frac=1)

进行了深拷贝或只是更改了数据框。我运行了以下代码:

print(hex(id(df)))
print(hex(id(df.sample(frac=1))))
print(hex(id(df.sample(frac=1).reset_index(drop=True))))

我的结果是:

0x1f8a784d400
0x1f8b9d65e10
0x1f8b9d65b70

这意味着该方法返回相同的对象,如上一条注释中所建议。因此,此方法确实可以产生随机的副本

答案 5 :(得分:3)

AFAIK最简单的解决方案是:

df_shuffled = df.reindex(np.random.permutation(df.index))

答案 6 :(得分:2)

还有什么用,如果您将其用于Machine_learning并且希望始终分离相同的数据,则可以使用:

df.sample(n=len(df), random_state=42)

这可以确保您的随机选择始终可复制

答案 7 :(得分:1)

关注可能是以下方式之一:

dataframe = dataframe.sample(frac=1, random_state=42).reset_index(drop=True)

其中

frac = 1 表示数据框的所有行

random_state = 42 意味着在每次执行中保持相同的顺序

reset_index(drop = True)表示重新初始化随机数据帧的索引

答案 8 :(得分:0)

通过在这种情况下采用示例数组 index 来对pandas数据帧进行随机化并随机化其顺序,然后将该数组设置为数据帧的索引。现在根据索引对数据帧进行排序。这是你的改组数据框

import random
df = pd.DataFrame({"a":[1,2,3,4],"b":[5,6,7,8]})
index = [i for i in range(df.shape[0])]
random.shuffle(index)
df.set_index([index]).sort_index()

<强>输出

    a   b
0   2   6
1   1   5
2   3   7
3   4   8

在上面的代码中将数据框插入我的地方。

答案 9 :(得分:0)

这是另一种方式:

df['rnd'] = np.random.rand(len(df)) df = df.sort_values(by='rnd', inplace=True).drop('rnd', axis=1)

答案 10 :(得分:0)

最简单的方法是下面的代码。 (Python)

from sklearn.utils import shuffle
dataFrame = shuffle(dataFrame)

这将使所有列都杂乱无章,并且您会很好地混合所有列,以便所有Type都被混合