Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在保持特定列顺序的同时洗牌数据帧_Python_Pandas_Dataframe - Fatal编程技术网

Python 如何在保持特定列顺序的同时洗牌数据帧

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

我有一个熊猫数据帧,我想洗牌,但保持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  |  
如何做到这一点?

这里有一个解决方案:

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。我该怎么做?我将用一个例子来编辑我的原始问题