python - 随机排列 DataFrame 的行,直到列中的所有连续值都不同?

标签 python pandas function dataframe recursion

我有一个数据帧,其中的行我想连续打乱,直到 B 列中的值在任何两个连续行中不相同:

初始数据框:

A  |  B
_______
a     1
b     1
c     2
d     3
e     3

可能的结果:

A  |  B
_______
b     1
c     2
e     3
a     1
d     3

我创建了一个函数 scramble 来执行此操作,但我无法将新加扰的数据帧传递回函数以测试匹配的 B 值:

def scamble(x):
    curr_B='nothing'
    for index, row in x.iterrows():
        next_B=row['B']
        if str(next_B) == str(curr_B):
            x=x.sample(frac=1)
            curr_B=next_B
        curr_B=next_B
    return x
df=scramble(df)

我怀疑该函数正在下一行中查找匹配值,但我无法连续对其进行洗牌,直到没有两个连续行具有相同的 B 值。

打印输出会生成一个数据帧,其中显示 B 中具有相同值的连续行。

最佳答案

如果您的目标是消除连续的重复项,您只需使用 groupbycumcount,然后重新索引您的 DataFrame:

df.loc[df.groupby('B').cumcount().sort_values().index]

   A  B
0  a  1
2  c  2
3  d  3
1  b  1
4  e  3
<小时/>

如果您确实想要随机性,那么您可以对 cumcount 进行分组并调用 shuffle。这应该在某种程度上消除连续的重复(不保证),同时保留随机性并仍然避免缓慢迭代。这是一个例子:

np.random.seed(0)
(df.groupby(df.groupby('B').cumcount(), group_keys=False)
   .apply(lambda x: x.sample(frac=1))
   .reset_index(drop=True))

   A  B
0  d  3
1  a  1
2  c  2
3  b  1
4  e  3

关于python - 随机排列 DataFrame 的行,直到列中的所有连续值都不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56552444/

相关文章:

r - 两个函数相乘

php - Javascript 和 PHP 函数

php - 如何访问内部函数PHP中的变量?

python - 关于类和 init 方法

python - Pandas : how to groupby time and column

python - 在 Pandas 中将一列列表扩展为多行

python - Pandas:.loc[...] 的类似列表的索引

python - 通过 pandas 中的唯一列将 2 个数据框列添加到列

python - 错误或本应是 : numpy raises "ValueError: too many boolean indices" for repeated boolean indices

python - 查找字符串中相同的部分