Python 如何在保持特定列顺序的同时洗牌数据帧
我有一个熊猫数据帧,我想洗牌,但保持1列的顺序 因此,假设我有以下df:Python 如何在保持特定列顺序的同时洗牌数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个熊猫数据帧,我想洗牌,但保持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
| 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 |
如何做到这一点?这里有一个解决方案:
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
欢迎来到SO。请在问题中加入示例-输入和预期输出-作为文本。我尝试了,但似乎不起作用。我会再次尝试编辑它。请回答一些内置函数,它们可以为您做到这一点。你好,弗兰克,您提到的帖子中似乎没有保留ID列的顺序。还是我理解错了?@Franke所指的问题与这个不同。天哪,谢谢!后续问题:如果我有多个其他专栏,我会怎么做?例如,一个val2?只需按多个列分组。这个解决方案应该有效。顺便说一句,你能接受我对后代的回答吗?不,我的意思是,我仍然只想根据ID列订购。但是我有一个DF,它的列数超过1。我该怎么做?我将用一个例子来编辑我的原始问题