Xer*_*Xer 5 python sorting duplicates dataframe pandas
如何对DataFrame进行排序,以便重复列中的行被“回收”。
例如,我原始的DataFrame如下所示:
In [3]: df
Out[3]:
A B
0 r1 0
1 r1 1
2 r2 2
3 r2 3
4 r3 4
5 r3 5
Run Code Online (Sandbox Code Playgroud)
我希望它转向:
In [3]: df_sorted
Out[3]:
A B
0 r1 0
2 r2 2
4 r3 4
1 r1 1
3 r2 3
5 r3 5
Run Code Online (Sandbox Code Playgroud)
对行进行排序,以使列中的行A采用“回收”方式。
我已经在Pandas中搜索过API,但是似乎没有任何合适的方法可以这样做。我可以编写一个复杂的函数来完成此操作,但是只是想知道是否有任何智能方法或现有的pandas方法可以做到这一点?非常感谢。
更新:对错误的陈述表示歉意。在我真正的问题中,列B包含字符串值。
您可以使用cumcount在列计数的重复A,那么sort_values首先A通过(在没有必要的样品,在真实数据也许很重要),然后C。最后删除列C的drop:
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
Run Code Online (Sandbox Code Playgroud)
时间:
小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
Run Code Online (Sandbox Code Playgroud)
大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
Run Code Online (Sandbox Code Playgroud)
计时代码:
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
Run Code Online (Sandbox Code Playgroud)