我有一个数据帧,其中的行我想连续打乱,直到 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/