【问题标题】:Sorting multiple columns based on list in Pandas根据 Pandas 中的列表对多列进行排序
【发布时间】:2021-10-09 04:48:33
【问题描述】:

感谢任何关于如何根据 pandas 中的倍数列表对给定的多列进行排序的提示,如下所示

import pandas as pd
sort_a=['a','d','e']
sort_b=['s1','s3','s6']
sort_c=['t1','t2','t3']
df=pd.DataFrame(zip(['a', 'e', 'd','a','a','d','e'], ['s3', 's1', 's6','s6','s3','s3','s1'], ['t3', 't2', 't1','t2','t2','t3','t3']),columns=["a", "b", "c"])

使用排序列,例如a,c,d

这个想法类似于sort

df.sort(['a', 'c', 'd'], ascending = [sort_a, sort_c, sort_b])

预期输出

a   b   c
a   s3  t2
a   s3  t3
a   s6  t2
d   s3  t3
d   s6  t1
e   s1  t2
e   s1  t3

【问题讨论】:

  • 请添加您的预期输出。我的输出可能不是你想要的
  • 嗨@sammywemmy,我已更改df 以反映3 sort_list 的用例。您的建议仍然有效

标签: python pandas sorting


【解决方案1】:

一种选择是为每一列创建类别并进行排序:

categories = {col : pd.CategoricalDtype(categories=cat, ordered=True) 
              for col, cat 
              in zip(df.columns, [sort_a, sort_b, sort_c])}

df.astype(categories).sort_values([*df.columns])

   a   b   c
0  a  s3  t3
2  d  s6  t1
1  e  s1  t2

【讨论】:

    【解决方案2】:

    虽然与参考列表的排序没有直接关系,但发布此 OP 时的关键问题是我想对其中包含 string 的列进行排序。

    对熊猫使用 sort_values >= 1.1.0

    使用 DataFrame.sort_values 中的新 key 参数,从 pandas 1.1.0 开始,我们可以直接对列进行排序,而无需使用 natsort.natsort_keygen 将其设置为索引:

    from natsort import natsort_keygen
    df=df.sort_values(
        by=['a','b','c'],
        key=natsort_keygen()
    )
    

    输出:

       a   b   c
    4  a  s3  t2
    0  a  s3  t3
    3  a  s6  t2
    5  d  s3  t3
    2  d  s6  t1
    1  e  s1  t2
    6  e  s1  t3
    

    【讨论】:

      猜你喜欢
      • 2021-10-09
      • 2020-02-29
      • 2019-03-07
      • 2020-04-23
      • 2015-01-08
      • 2022-12-18
      • 2021-03-09
      • 2018-03-15
      • 2023-04-01
      相关资源
      最近更新 更多