当前位置: 首页 > 知识库问答 >
问题:

洗牌数据帧行

郜杰
2023-03-14

我有以下数据帧:

    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文件中读取的。所有类型为Type1的行都位于顶部,后面是类型为Type2的行,后面是类型为Type3的行,以此类推。

我想改变数据帧行的顺序,这样所有的类型都是混合的。一个可能的结果可能是:

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

我怎样才能做到这一点?

共有3个答案

侯英达
2023-03-14

通过使用无序索引进行索引,可以无序排列数据帧的行。为此,您可以使用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\u shuffled.reset\u index(drop=True)

慕宪
2023-03-14

您可以简单地使用sklearn进行此操作

from sklearn.utils import shuffle
df = shuffle(df)
汪永春
2023-03-14

使用Pandas进行此操作的惯用方法是使用dataframe的.sample方法对所有行进行采样,而不进行替换:

df.sample(frac=1)

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

注意:如果您希望将数据帧就地洗牌并重置索引,您可以执行例如:

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

在这里,指定drop=True可以防止.reset_index创建包含旧索引条目的列。

后续注意:虽然上面的操作看起来并不到位,但python/熊猫足够聪明,不会为洗牌对象做另一个malloc。也就是说,即使引用对象已经改变(我的意思是id(df_old)id(df_new)不一样),底层的C对象仍然是相同的。为了证明确实如此,您可以运行一个简单的内存分析器:

$ python3 -m memory_profiler .\test.py
Filename: .\test.py

Line #    Mem usage    Increment   Line Contents
================================================
     5     68.5 MiB     68.5 MiB   @profile
     6                             def shuffle():
     7    847.8 MiB    779.3 MiB       df = pd.DataFrame(np.random.randn(100, 1000000))
     8    847.9 MiB      0.1 MiB       df = df.sample(frac=1).reset_index(drop=True)

 类似资料:
  • 我有这个数据帧: 我需要随机洗牌,除了第一行,有什么帮助吗?

  • 大多数纸牌游戏都需要洗牌,也就是让纸牌随机排列。在第10.5节,我们看到了怎样生成随机数,但怎样利用随机数实现洗牌功能却并非显然意见的。 一种可行的方案是,模拟人洗牌的方法,将牌分为两堆,然后通过在每个牌堆中轮流选择的方式实现原牌堆的重新组织。因为一般而言,人并不能做到完美地洗牌,而程序经过大约7次迭代之后,牌堆中纸牌的顺序已经相当随机了。但是计算机程序每次在做完美洗牌的时候有一个令人讨厌的属性—

  • 在第13.6节我们编写了一个洗牌算法的伪代码。假设shuffleDeck函数实现洗牌功能,其参数为一个牌堆,我们就可以这样创建牌堆并洗牌: Deck deck; // 创建一个标准的52张牌的牌堆 deck.shuffle (); // 洗牌 然后,使用subdeck函数来分几手牌: Deck hand1 = deck.subdeck (0, 4); Deck hand2 = dec

  • 问题内容: 我想知道,是否有某种方法可以在mysql / sql中改组字符串的字母,即类似 伪代码的内容 :? 从http://dev.mysql.com/doc/refman/5.0/en/string- functions.html 找不到任何内容,对其进行搜索似乎只是找到改组结果的解决方案,而不是字符串。 问题答案: 干得好: 有关输出,请参见sqlfiddle.com。 已使用mariad

  • 理想中,我们获取的数据都是一样的格式,可是现实中,会有许多脏数据,有时候是数据太冗余,有时候是数据缺失,有时候是同一种类数据拥有不同的数据格式。比如生日,有的人使用阿拉伯数字,有的人使用英文简写,有的人则是加入了中文字符。 如果只是简单的某一列数据问题,我们可以写一个脚本进行处理,可是,当数据太复杂,数据量太大,我们自己编写脚步就太浪费时间和精力了。有没有什么可视化工具,可以像操作Excel表格很

  • Reference 关于乱序(shuffle)与随机采样(sample)的一点探究 - xybaby - 博客园 洗牌算法 Fisher–Yates shuffle - Wikipedia Knuth-Durstenfeld Shuffle(Fisher–Yates Shuffle 改进版) Knuth-Durstenfeld Shuffle 是一个“原地”(in-place)算法 伪代码 To