iT邦幫忙

0

Python Pandas 使用 pd.corsstab 的欄位排列錯位問題

  • 分享至 

  • xImage

各位前輩大大好,小弟遇到一個不知名的問題,希望有前輩大大可以幫忙解惑。

我的df,有3個欄位,分別是
trial_Level (type=str)
signupDays_Level (type=str)
yesNo (type=float64)
tdf.info
tdf.head(10)

原本我的代碼在做corsstab的時候,都有很正常的按照順序排列

然後有一天他突然就失靈了,原本分組10的都會在最後面,但突然就往前跑了,由於我有十幾個crosstab要跑,希望能找到一個解決根本的問題。

corsstab

這個corsstab是為了進行heatMap,錯位對整體顏色的影響滿大的

heatMap

在獨立執行
pd.crosstab([df_name[columnA],(df_name['yesNo'] == 0)], df_name[columnB])的時候,就產生錯位了,所以初步判斷這個錯誤與後面的代碼"應該"是沒有關聯性。

附上代碼
cross_test

def cross_test(df_name, columnA, columnB, showtype=2):
    tdf1 = pd.crosstab([df_name[columnA],(df_name['yesNo'] == 0)], 
                                                      df_name[columnB])
    tdf2 = pd.crosstab([df_name[columnA],(df_name['yesNo'] == 1)], 
                                                      df_name[columnB])
    tdf3 = tdf1 / (tdf1 + tdf2)
    iloclist = []
    #showtype參數2:僅顯示True的部分
    if showtype == 2 :
        [iloclist.append(x) for x in range(1,len(tdf3),2)]
        return tdf3.iloc[iloclist,:]
    #showtype參數3:僅顯示False的部分
    if showtype == 3 :
        [iloclist.append(x) for x in range(0,len(tdf3),2)]
        return tdf3.iloc[iloclist,:]
    return tdf3

cross_test(tdf, 'trial_Level', 'signupDays_Level')

heatMap_test

def heatMap_test(df_name, columnA, columnB, showtype=2):
    plt.figure(figsize=(8, 6))
    sns.set(font_scale=1)    
    sns.heatmap(cross_test(df_name, columnA, columnB, showtype).fillna(0),annot=True)
    
heatMap_test(tdf, 'trial_Level', 'signupDays_Level')

dataLevel

def dataLevel(series_in, new_name):
    quantileEdges = [0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]
    binsEdges = []
    binsNames = []
    #根據series_in進行quantile(劃分10組界線)
    for i in quantileEdges:
        sq = series_in.quantile(i)
        binsEdges.append(sq)
        binsNames.append('{}_分組{}({})'.format(series_in.name, int(i*10), int(sq)))
    #處理bins前幾項重複的問題(ex: '時間diff' 前30%數據都是0)
    binsEdges = sorted(set(binsEdges))
    binsNames = binsNames[-len(binsEdges)+1:]
    #分組並建立新欄位    
    df[new_name] = pd.cut(df[series_in.name].fillna(0), bins=binsEdges, labels=binsNames, right=False)
    print('new column [{}] created!'.format(new_name))
    return True
str沒有int排序的概念,對str來說,1下一個就是1x,接著才是2。
你說原本沒問題突然出問題,我猜是你import的heatmap package有改版,或是你原本的字樣是01,02,03...而非1,2,3...。
解決方法,擷取【組】和【左括號(】中間的文字(整數)出來,長度為1的補0後再塞回去,就OK了。
Peter iT邦新手 4 級 ‧ 2020-02-04 16:40:43 檢舉
感謝張小馬大大的回覆,提供了很簡潔的方法。

稍早我自己猜測(非資工背景純屬瞎猜),是不是python在進行分組的時候,會把當時分組的順序當作corsstab的排列參照,因為分組是先前在做數據清洗的時候一起做的,之後就另存成新的csv,後續在做heatmap的時候,是直接抓取csv檔的資料直接做,所以他必須重新排列,就會遇到大大說的str沒有int排序的概念。

因此我把先前define的分組function (更新在文章的最後),在heatmap的同一個ipython中,再重新執行一次,然後corsstab的排列居然就回復正常了。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友回答

立即登入回答