我有一个数据框,其中的行我想连续地改组,直到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
中具有相同值的连续行。
答案 0 :(得分:2)
如果您的目标是消除连续的重复项,则可以只使用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