python - 按重复项对 DataFrame 的行进行排序

标签 python sorting pandas dataframe duplicates

如何对 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

我希望它变成:

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

对行进行排序,使 A 列中的行处于“回收”方式。

我在 Pandas 中搜索过 API,但似乎没有任何合适的方法可以这样做。我可以编写一个复杂的函数来完成此操作,但只是想知道是否有任何聪明的方法或现有的 pandas 方法可以做到这一点?非常感谢。

更新: 为错误的陈述道歉。在我的实际问题中,B 列包含字符串值。

最佳答案

您可以使用 cumcount用于计算 A 列中的重复项,然后是 sort_values首先是 A(在示例中不是必需的,在实际数据中可能很重要)然后是 C。最后删除列 C by 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

时间:

小 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

关于python - 按重复项对 DataFrame 的行进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38949190/

相关文章:

python - 如何使用生成器在换行符上拆分套接字读取数据

python - 关于使用 ttk.Style() 的问题?

javascript - Jquery 错误地按 id 对 <li> 进行排序

python - 使用 Pandas .groupby 时,为什么要使用 .agg 而不是直接使用函数,例如 .sum()

python - 从excel读取数据并忽略python中的空行

python - python pandas中类因子列不同级别的最大和最小时间

python - 用于检查 IP 是否列入白名单的脚本函数

python - PyQt 自定义小部件未显示

使用 Dojo Dgrid 默认(加载时)对列进行排序

javascript - 将无限数量的参数传递给 sort() 函数