【问题标题】:How to shuffle a dataframe while maintaining the order of a specific column如何在保持特定列的顺序的同时打乱数据帧
【发布时间】:2020-07-18 19:28:51
【问题描述】:

我有一个 pandas 数据框,我想对其进行洗牌,但要保持 1 列的顺序。

所以想象一下我有以下df:

| i | val | val2| ID |    
| 0 | 2   | 2 |a  |  
| 1 | 3   | 3 |b  |  
| 2 | 4   | 4 |a  |  
| 3 | 6   | 5 |b  |  
| 4 | 5   | 6 |b  |  

我想打乱行,但保持第一个 df 的 ID 列的顺序。我想要的结果是这样的:

| i | val | val2| ID |  
| 2 | 4   | 4 |a  |    
| 4 | 5   | 6 |b  |  
| 0 | 2   | 2 |a  |  
| 3 | 6   | 5 |b  |  
| 1 | 3   | 3 |b  |  

我该怎么做?

【问题讨论】:

  • 欢迎来到 SO。请在问题中包含示例 - 输入和预期输出 - 作为文本
  • 我试过了,但似乎没有用。我会尝试再次编辑它
  • 请参阅this 回答一些可以为您执行此操作的内置函数。
  • 嗨弗兰克,您提到的帖子中似乎没有保留 ID 列的顺序。还是我理解错了?
  • @Franke 所指的问题与这个不同。

标签: python pandas dataframe


【解决方案1】:

这里有一个解决方案:

df = pd.DataFrame({"val": [1, 2, 3, 4, 5, 6, 7], "ID": ["a", "b", "a", "b", "a", "a", "b"]})
df["val"] = df.groupby("ID").transform(lambda x: x.sample(frac=1))
print(df)

输出是:

   val ID
0    5  a
1    7  b
2    1  a
3    2  b
4    3  a
5    6  a
6    4  b

如果您有一个包含多列的数据框,并且您希望在保持其中一列的顺序的同时进行洗牌,则解决方案非常相似:

df = pd.DataFrame({"val": [1, 2, 3, 4, 5, 6, 7], 
                   "val2": range(10, 17), 
                   "ID": ["a", "b", "a", "b", "a", "a", "b"], 
                  })

df[["val", "val2"]] = df.groupby("ID").transform(lambda x: x.sample(frac=1))
print(df)

==>

   val  val2 ID
0    3    12  a
1    7    16  b
2    5    14  a
3    2    11  b
4    6    15  a
5    1    10  a
6    4    13  b

【讨论】:

  • 天哪,谢谢!后续问题:如果我有超过 1 个其他列,我会怎么做?以 val2 为例?
  • 只需按多列分组。该解决方案应该有效。顺便说一句 - 你能接受我对后代的回答吗?
  • 不,我的意思是我仍然想仅根据 ID 列进行订购。但是我有一个列数超过 1 的 DF。我该怎么做?我会用一个例子编辑我原来的问题
猜你喜欢
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
  • 2017-09-20
  • 2019-11-23
  • 2021-05-12
  • 1970-01-01
相关资源
最近更新 更多