随机整理DataFrame的行,直到列中的所有连续值都不同?

时间:2019-06-11 22:31:00

标签: 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中具有相同值的连续行。

1 个答案:

答案 0 :(得分:2)

如果您的目标是消除连续的重复项,则可以只使用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