代码之家  ›  专栏  ›  技术社区  ›  Michael Gruenstaeudl

如何使用键参数按列对Pandas数据帧进行排序

  •  1
  • Michael Gruenstaeudl  · 技术社区  · 9 月前

    假设一个Pandas数据帧(为了简单起见,假设有三列)。列标题为 A , B d .

    $ import pandas as pd
    $ df = pd.DataFrame([[1, 2, "a"], [1, "b", 3], ["c", 4, 6]], columns=['A', 'B', 'd'])
    $ df
       A  B  d
    0  1  2  a
    1  1  b  3
    2  c  4  6
    

    进一步假设我希望对数据帧进行排序,以使列完全具有以下顺序: d , A. , B .数据帧的行不得以任何方式重新排列。所需输出为:

    $ col_target_order = ['d', 'A', 'B']
    $ df_desired
       d  A  B
    0  a  1  2
    1  3  1  b
    2  6  c  4
    

    我知道这可以通过 sort_index 熊猫的功能。但是,以下内容不起作用,因为输入列表( col_target_order )不可调用:

    $ df.sort_index(axis=1, key=col_target_order)
    

    我必须使用什么密钥规格?

    2 回复  |  直到 9 月前
        1
  •  1
  •   mozway    9 月前

    不要排序,只需索引:

    out = df[col_target_order]
    

    为了论证起见,你可以 sort_index 以精心制作的系列作为密钥:

    df.sort_index(axis=1, key=pd.Series(range(len(col_target_order)), index=col_target_order).get)
    

    或索引索引器:

    df.sort_index(axis=1, key=pd.Index(col_target_order).get_indexer)
    

    输出

       d  A  B
    0  a  1  2
    1  3  1  b
    2  6  c  4
    
        2
  •  1
  •   Cameron Riddell    9 月前

    这里不需要太多额外的内容,您可以将这些列直接传递到方括号索引中 .loc 或者 reindex(…, axis=1)

    import pandas as pd
    df = pd.DataFrame([[1, 2, "a"], [1, "b", 3], ["c", 4, 6]], columns=['A', 'B', 'd'])
    col_target_order = ['d', 'A', 'B']
    
    print(
        df[['d', 'A', 'B']],
        df[col_target_order],
        df.reindex(columns=col_target_order),
        sep='\n\n'
    )
    
    ## all outputs:
    #    d  A  B
    # 0  a  1  2
    # 1  3  1  b
    # 2  6  c  4
    

    请注意,如果 col_target_order 具有不存在的列,前两种方法将因 KeyError 这个 .reindex 方法将插入列并用填充其行 NaN s

    import pandas as pd
    df = pd.DataFrame([[1, 2, "a"], [1, "b", 3], ["c", 4, 6]], columns=['A', 'B', 'd'])
    col_target_order = ['d', 'A', 'B', 'Z']
    
    try:
        print(df[col_target_order]) # KeyError
    except KeyError:
        print('`col_target_order` column not found!')
    
    print(df.reindex(columns=col_target_order))
    #    d  A  B   Z
    # 0  a  1  2 NaN
    # 1  3  1  b NaN
    # 2  6  c  4 NaN
    

    如果要删除中出现的任何列 col_target_order 但不要 存在于 DataFrame 可以找到与柱的交点。

    import pandas as pd
    df = pd.DataFrame([[1, 2, "a"], [1, "b", 3], ["c", 4, 6]], columns=['A', 'B', 'd'])
    col_target_order = ['d', 'A', 'B', 'Z']
    
    overlapping_cols = df.columns.intersection(col_target_order)
    print(df[overlapping_cols]) # 'Z' was dropped!
    #    A  B  d
    # 0  1  2  a
    # 1  1  b  3
    # 2  c  4  6