可以使用cumcount
通過A
在A
列計數的重複,然後sort_values
第一(在沒有必要的樣品,在真實數據也許很重要),然後由C
。最後由drop
刪除列C
:
df['C'] = df.groupby('A')['A'].cumcount()
df.sort_values(by=['C', 'A'], inplace=True)
print (df)
A B C
0 r1 0 0
2 r2 2 0
4 r3 4 0
1 r1 1 1
3 r2 3 1
5 r3 5 1
df.drop('C', axis=1, inplace=True)
print (df)
A B
0 r1 0
2 r2 2
4 r3 4
1 r1 1
3 r2 3
5 r3 5
時序:
小DF(len(df)=6
)
In [26]: %timeit (jez(df))
1000 loops, best of 3: 2 ms per loop
In [27]: %timeit (boud(df1))
100 loops, best of 3: 2.52 ms per loop
大DF(len(df)=6000
)
In [23]: %timeit (jez(df))
100 loops, best of 3: 3.44 ms per loop
In [28]: %timeit (boud(df1))
100 loops, best of 3: 2.52 ms per loop
代碼時間:
df = pd.concat([df]*1000).reset_index(drop=True)
df1 = df.copy()
def jez(df):
df['C'] = df.groupby('A')['A'].cumcount()
df.sort_values(by=['C', 'A'], inplace=True)
df.drop('C', axis=1, inplace=True)
return (df)
def boud(df):
df['C'] = df.groupby('A')['B'].rank()
df = df.sort_values(['C', 'A'])
df.drop('C', axis=1, inplace=True)
return (df)
100 loops, best of 3: 4.29 ms per loop
我根據標題中提到的重複項目採取OP問題。編輯該帖子,將您的寶貴意見考慮在內。謝謝 – Boud
超級,你的第二個解決方案現在可以很好地工作(但不幸的是,它更慢。) – jezrael
謝謝,佈德。學習了一個非常有用的方法'rank'。然而,在我真正的問題中,「B」列實際上不是數字,所以我不能在該列上使用「rank」。我應該說,我的道歉。 – Xer