簡體   English   中英

Pandas:更改交叉表結果的順序

[英]Pandas: change order of crosstab result

如何更改pd.crosstab結果的順序:

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

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

  • df['col1']df['col2']的唯一值(交叉表結果的列/行)
  • 按邊際值(例如,顯示更接近頂部的df['col1']的更高計數值)

好吧,如果你提供了一個數據示例,那么給你一個解決方案會更容易,因為它可以相應地變化很多。 我將嘗試在下面構建案例場景和可能的解決方案。

如果我們采用示例數據和交叉表:

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']的唯一值(交叉表結果的cols / rows)
  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)

或者,您可以定義要訂購的指標(行平均值)並相應地進行排序。

希望有所幫助!

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM