【问题标题】:Is there a way to sort pandas columns by intersections with rows?有没有办法通过与行的交叉点对熊猫列进行排序?
【发布时间】:2020-03-16 08:11:21
【问题描述】:

我有一个 pandas 表,其中包含行和列,并且数据仅在行和列之间的一些交叉点中。见下文:

     col1  col2  col3  col4  col5
row1  1
row2               1    1
row3  1     
row4                    1     1
row5        1                

我想对列进行排序,以便与第 1 行相交的列排在第一位,与第 2 行相交的列排在第二位,依此类推。如下:

     col1  col3  col4  col5  col2
row1  1
row2        1      1    
row3  1     
row4               1     1
row5                          1

感谢您的任何建议。

【问题讨论】:

    标签: python-3.x pandas dataframe rows columnsorting


    【解决方案1】:

    如果那些空单元格是Nan,你可以在notnull()上使用idxmax()

    orders = df.notnull().agg(['any', 'idxmax']).T
    col_orders = orders.sort_values(['any', 'idxmax'],
                                    ascending=[False, True]).index
    
    
    df[col_orders]
    

    输出:

          col1  col3  col4  col5  col2
    row1   1.0   NaN   NaN   NaN   NaN
    row2   NaN   1.0   1.0   NaN   NaN
    row3   1.0   NaN   NaN   NaN   NaN
    row4   NaN   NaN   1.0   1.0   NaN
    row5   NaN   NaN   NaN   NaN   1.0
    

    【讨论】:

    • @joaquin 是必需的,因为每列中的max 可以出现在后面的行中。想想如果col11 nan 3 nan nan 会发生什么。
    • 我还意识到我有一列所有行都用 NaN 填充。不知何故,当我运行您所写的内容时,我将此专栏排在第二位,而不是最后一个。你知道我怎样才能避免这种情况吗?还是我应该为此编辑问题?
    • @danvoronov 谢谢,这显然是一个有趣的边缘案例。查看更新。
    • @QuangHoang 谢谢,它不适用于我的数据集,给出 KeyError: 'any'。但在添加轴 1 并转置后工作:col_orders = orders.sort_values(['any', 'idxmax'], axis=1).T.index
    • @danvoronov 谢谢。另请参阅我的最新更新以获取正确的sort_values
    猜你喜欢
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多