python Pandas:交叉表结果的更改顺序

sulc1iza  于 2023-01-11  发布在  Python
关注(0)|答案(2)|浏览(148)

如何改变 *pd. crosstable * 结果中的顺序:

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

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

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

wnavrhmk1#

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

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

我们有以下输出:

这是一个常规的 Dataframe 对象,它只是“交叉表”或更好的“透视表”相应。
您要显示:

  1. df ['col 1']或df ['col 2']的唯一值(交叉表结果的列/行)
    1.按边缘值(例如,显示更靠近顶部的df ['col 1']的较高计数值)
    所以让我们从“1”开始:
    有不同的方法可以做到这一点,一个简单的解决方案是显示相同的数据框对象与布尔值的奇异情况;
[CT == 1]

但是,在大型 Dataframe 的情况下,这种格式可能不是您想要的。
你可以直接打印出肯定的情况,或者列出/追加它们,一个简单的例子是:

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)

或者,您可以定义一个要排序的指标(行平均值)并相应地进行排序。
希望能有所帮助!

qyyhg6bp

qyyhg6bp2#

df_stack = pd.DataFrame({'Country':['USA','USA','MEX','IND','UK','UK','UK'],
               'Region':['Americas',np.nan,np.nan,'Asia','Europe',np.nan,np.nan],
               'Flower':['Rose','Rose','Lily','Orchid','Dandelion','Dandelion','Dandelion'],
               'Animal':['Bison',np.nan,'Golden Eagle','Tiger','Lion','Lion',np.nan],
               'Game':['Baseball','Baseball','soccer','hockey','cricket','cricket','cricket']})
print("-------Normal Dataframe------")
print(df_stack)
#created cross tab for getting animal regionwise
crosstab = pd.crosstab(df_stack.Region,df_stack.Animal)
print("-------Before Sorting Crosstab------")
print(crosstab)
#Apply sorting to specific column in this case 'Lion'
crosstab = crosstab.sort_values(['Lion'], ascending=False)
print("-------After Sorting Crosstab by Lion Column------")
print(crosstab)
-------Normal Dataframe------
  Country    Region     Flower        Animal      Game
0     USA  Americas       Rose         Bison  Baseball
1     USA  Americas       Rose         Bison  Baseball
2     MEX  Americas       Lily  Golden Eagle    soccer
3     IND      Asia     Orchid         Tiger    hockey
4      UK    Europe  Dandelion          Lion   cricket
5      UK    Europe  Dandelion          Lion   cricket
6      UK    Europe  Dandelion          Lion   cricket
-------Before Sorting Crosstab------
Animal    Bison  Golden Eagle  Lion  Tiger
Region                                    
Americas      2             1     0      0
Asia          0             0     0      1
Europe        0             0     3      0
-------After Sorting Crosstab by Lion Column------
Animal    Bison  Golden Eagle  Lion  Tiger
Region                                    
Europe        0             0     3      0
Americas      2             1     0      0
Asia          0             0     0      1

相关问题