我有一个数据帧,其中的行我想连续地改组,直到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
中具有相同值的连续行。 最佳答案
如果您的目标是消除连续的重复项,则可以只使用groupby
和cumcount
,然后为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/