通过自定义方式对熊猫数据框进行排序

我已经尝试了很多以自己的方式对 DataFrame 列进行排序。但无法正确地做到这一点。所以请参考给定的代码,让我知道完成这项工作的附加语法是什么。

df = pd.DataFrame({'TC': {0: '1-1.1', 1: '1-1.2', 2: '1-10.1', 3: '1-10.2', 4: '1-2.1', 5: '1-2.1', 6: '1-2.2', 7: '1-20.1', 8: '1-20.2', 9: '1-3.1'}, 'Case': {0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E', 5: 'F', 6: 'G', 7: 'H', 8: 'I', 9: 'J'}})
df.sort_values(["TC"], ascending=[True])
print (df)

这段代码没有给出想要的输出。我需要按以下方式排序的数据框。

回答

您可以提取数字并形成一个tuple,然后series对其index进行排序并将其用于reindex您的原始数据帧。

>>> df.reindex(
        df['TC'].str.extractall('(d+)')
                .unstack().astype(int)
                .agg(tuple, 1).sort_values()
                .index
    )

       TC Case
0   1-1.1    A
1   1-1.2    B
4   1-2.1    E
5   1-2.1    F
6   1-2.2    G
9   1-3.1    J
2  1-10.1    C
3  1-10.2    D
7  1-20.1    H
8  1-20.2    I

您还可以在key中使用参数sort_values

>>> df.sort_values('TC', 
        key=lambda ser:
           ser.str.extractall('(d+)')
              .unstack()
              .astype(int).agg(tuple, 1)
    )

如果 an 总是由三个部分组成,则ID您可以Series.str.splitnon-numeric字符上使用expand=True, 而不是extractall,因此无需使用unstack

>>> df.sort_values('TC', 
         key=lambda series:
             series.str.split(r'D+', expand=True)
                   .astype(int).agg(tuple,1)
    )

时间:

>>> %timeit df.reindex(df['TC'].str.extractall('(d+)').unstack().astype(int).agg(tuple, 1).sort_values().index)
2.95 ms ± 40.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

>>> %timeit df.sort_values('TC', key=lambda ser: ser.str.extractall('(d+)').unstack().astype(int).agg(tuple, 1))
2.91 ms ± 32.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

>>> %timeit df.sort_values('TC', key=lambda series:series.str.split(r'D+', expand=True).astype(int).agg(tuple,1))
1.6 ms ± 5.88 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)


以上是通过自定义方式对熊猫数据框进行排序的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>