熊猫:改变交叉表结果的顺序

时间:2017-03-13 17:59:05

标签: python pandas

如何更改 pd.crosstab 的结果中的顺序:

pd.crosstab(df['col1'], df['col2'])

我希望能够按以下方式排序:

  • df ['col1'] df ['col2'] 的唯一值(交叉表结果的cols / rows)
  • 按边际值显示(例如显示 df ['col1'] 的更高计数值更靠近顶部)

1 个答案:

答案 0 :(得分:3)

如果你提供了一个数据示例,那么给你一个解决方案会更容易,因为它可以相应地变化很多。我将尝试在下面构建案例场景和可能的解决方案。

如果我们采用示例数据和交叉表:

a = np.array(['foo', 'foo', 'foo', 'foo', 'bar', 'bar',
       'bar', 'bar', 'foo', 'foo', 'foo'], dtype=object)

c = np.array(['dull', 'dull', 'shiny', 'dull', 'dull', 'weird',
       'shiny', 'dull', 'shiny', 'shiny', 'shiny'], dtype=object)

CT = pd.crosstab(a, c, rownames=['a'], colnames=['c'])

CT

我们有以下输出:

enter image description here

这是一个常规的数据框对象,它只是“交叉”或更好,但相应地“可枢转”。

您想要展示:

  1. df ['col1']或df ['col2']的唯一值(交叉表结果的cols / rows)
  2. 通过边际值(例如,显示更接近顶部的df ['col1']的更高计数值)
  3. 所以我们先从“1”开始:

    有不同的方法可以做到这一点,一个简单的解决方案是使用布尔值显示相同的数据框对象以用于奇异情况;

    [CT == 1]
    

    enter image description here

    但是,在大型数据帧的情况下,这种格式可能不是您想要的。

    你可以打印正面案例,或者列出/追加它们,一个简单的例子就是:

    for col in CT.columns:
    
        for index in CT.index:
    
            if CT.loc[index,col] == 1:
    
                print (index,col,'singular')
    

    输出:

    ('bar', 'shiny', 'singular')
    ('bar', 'weird', 'singular')
    

    第二项/愿望更复杂。 您想以更高的价格订购。但可能存在分歧。与一组索引关联的一列中较高的值很可能从第二列开始按顺序分叉(也在相同索引中关联)。

    因此,您可以选择按一个特定列进行排序:

    CT.sort_values('column_name', ascending=False)
    

    或者,您可以定义要订购的指标(行平均值)并相应地进行排序。

    希望有所帮助!