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

目标是根据 pandas 中的倍数列表对给定的多列进行排序,如下所示。感谢sammywemmy 的提示。

但是,该建议为未考虑的其他列生成了 nan 列。

import pandas as pd
sort_a=['a','d','e']
sort_b=['s1','s3','s6']
sort_c=['t1','t2','t3']
df=pd.DataFrame(zip([1,2,3,4,5,6,7],['a', 'e', 'd','a','a','d','e'], ['s3', 's1', 's6','s6','s3','s3','s1'], ['t3', 't2', 't1','t2','t2','t3','t3']),columns=['var',"a", "b", "c"])

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

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



   var    a    b   c
2  NaN  NaN  NaN  t1
1  NaN  NaN  NaN  t2
3  NaN  NaN  NaN  t2
4  NaN  NaN  NaN  t2
0  NaN  NaN  NaN  t3
5  NaN  NaN  NaN  t3
6  NaN  NaN  NaN  t3

然而,预期的输出

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

【问题讨论】:

    标签: python pandas sorting


    【解决方案1】:

    不要传递df.columns,而是传递您想要包含的列名:

    categories = {col : pd.CategoricalDtype(categories=cat, ordered=True)
                  for col, cat
                  in zip(['a','b','c'], [sort_a, sort_b, sort_c])}
    

    最后在sort_values()中传递by参数而不是解包df.columns传递category的key并解包:

    df=df.astype(categories).sort_values([*categories.keys()])
    

    df的输出:

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

    【讨论】:

      【解决方案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()
      )
      

      输出:

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

      【讨论】:

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