给出以下DF:

data = {'Org': ['Tom', 'Kelly', 'Rick', 'Dave','Sara','Liz'], 
        'sum': [3, 4, 4, 4, 5, 5]}
df = pd.DataFrame(data)

#      Org  sum
# 0    Tom    3
# 1  Kelly    4
# 2   Rick    4
# 3   Dave    4
# 4   Sara    5
# 5    Liz    5

我想只混洗重复的值在该列并保持排序顺序.

输出应如下所示:

data = {'Org': ['Tom', 'Rick', 'Dave', 'Kelly','Liz','Sara'],
        'sum': [3, 4, 4, 4, 5, 5]}
df = pd.DataFrame(data)

#      Org  sum
# 0    Tom    3
# 1   Rick    4
# 2   Dave    4
# 3  Kelly    4
# 4    Liz    5
# 5   Sara    5

有了df.sample(frac=1),它将洗牌所有的行,但这不是我喜欢实现的.

谢谢

推荐答案

sorted groups

如果您的组是连续的,并且希望保持相对顺序,请使用groupby.sample:

out = df.groupby('sum', sort=False).sample(frac=1)

示例输出:

     Org  sum
0    Tom    3
3   Dave    4
1  Kelly    4
2   Rick    4
5    Liz    5
4   Sara    5

如果你把输出按sum排序,那么:

out = df.groupby('sum', sort=False).sample(frac=1)
# or
out = df.sample(frac=1).sort_values(by='sum', kind='stable')

这将确保组被排序,即使它们在输入中没有被排序.

intact groups

相反,如果你想保留组的原始顺序完全不变,但仍想在组内进行洗牌,就像下面的例子:

     Org  sum
0    Tom    3
1  Kelly    4
2   Rick    4
3   Sara    5
4    Liz    5
5   Dave    4 # this is part of group "4" but we want the row to stay there

然后使用groupby.transform将索引混洗到位,然后重新索引:

out = df.loc[df.groupby('sum', sort=False)['sum']
               .transform(lambda g: g.sample(frac=1).index)]

示例输出:

     Org  sum
0    Tom    3
2   Rick    4
5   Dave    4
4    Liz    5
3   Sara    5
1  Kelly    4 # the group was shuffled, not the absolute position

Python相关问答推荐

提取两行之间的标题的常规表达

Python 3.12中的通用[T]类方法隐式类型检索

Python在tuple上操作不会通过整个单词匹配

numba jitClass,记录类型为字符串

为什么抓取的HTML与浏览器判断的元素不同?

将输入聚合到统一词典中

使用Python更新字典中的值

在单个对象中解析多个Python数据帧

从列表中获取n个元素,其中list [i][0]== value''

循环浏览每个客户记录,以获取他们来自的第一个/最后一个渠道

获取PANDA GROUP BY转换中的组的名称

如何反转一个框架中列的值?

在我融化极点数据帧之后,我如何在不添加索引的情况下将其旋转回其原始形式?

python的文件. truncate()意外地没有截断'

为罕见情况下的回退None值键入

Python日志(log)库如何有效地获取lineno和funcName?

如何为需要初始化的具体类实现依赖反转和接口分离?

如何防止html代码出现在quarto gfm报告中的pandas表之上

将索引表转换为Numy数组

多个布尔条件的`jax.lax.cond`等效项