【问题标题】:Pandas: change order of crosstab resultPandas:更改交叉表结果的顺序
【发布时间】:2017-08-03 20:49:01
【问题描述】:

如何在pd.crosstab的结果中改变顺序

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

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

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

【问题讨论】:

  • pandas.DataFrame.sort_valuespandas.DataFrame.sort_index
  • 你可能想看看pandas.pivot_table。它通常可以做与crosstab 非常相似的事情。你可以对它们进行排序。这是example

标签: python pandas


【解决方案1】:

好吧,如果您提供数据示例,则更容易为您提供解决方案,因为它可能会相应地变化很大。我将尝试在下面构建一个案例场景和可能的解决方案。

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

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

我们有以下输出:

这是一个常规的数据框对象,它只是“交叉表”或更好的“数据透视”。

你想展示:

  1. df['col1'] 或 df['col2'] 的唯一值(交叉表结果的列/行)
  2. 按边际值(例如,显示更靠近顶部的 df['col1'] 的更高计数值)

让我们从“1”开始:

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

[CT == 1]

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

您可以只打印正面案例,或列出/附加它们,一个简单的例子是:

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)

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

希望有帮助!

【讨论】:

    猜你喜欢
    • 2019-10-30
    • 2013-10-30
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    相关资源
    最近更新 更多