簡體   English   中英

Pandas 分位數 function 未返回給定分位數的正確數量

[英]Pandas quantile function not returning the correct number of given quantiles

我有一個 dataframe 有超過 2,000 條記錄,其中有多個具有各種余額的列。 根據我想將其分配給存儲桶的余額。

嘗試將每個余額列拆分為一個分位數並具有以下存儲桶0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9具體而言,將余額轉換為以下存儲桶:前 10%、前 20%、前30% 等等...

如果我理解正確,只要有超過 10 條記錄,它就應該根據線性插值將每條記錄存儲在百分位數中。

所以我運行以下命令:

score_quantiles =  df.quantile(q=[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9])
score_quantiles.to_dict()



# Arguments (x = value, p = field (i.e bal 1, bal2, bal3) , d = score_quantiles)

def dlpScore(x,p,d):
    if pd.isnull(x) == True:
        return 0 
    elif int(x) == 0:
        return 0
    elif x <= d[p][0.1]:
        return 1
    elif x <= d[p][0.2]:
        return 2
    elif x <= d[p][0.3]: 
        return 3
    elif x <= d[p][0.4]: 
        return 4
    elif x <= d[p][0.5]: 
        return 5
    elif x <= d[p][0.6]: 
        return 6
    elif x <= d[p][0.7]: 
        return 7
    elif x <= d[p][0.8]: 
        return 8
    elif x <= d[p][0.9]: 
        return 9
    else:
        return 10



df['SCORE_BAL1'] = df['bal1'].apply(dlpScore, args=('bal1',score_quantiles,))




問題是,在某些列上,它給了我所有的桶,而在其他列上,它只給了我一些:

在此處輸入圖像描述 在此處輸入圖像描述

有沒有辦法確保它創建所有的桶? 我可能在這里遺漏了一些東西。

如果您想確保在“桶”之間獲得相似的分布,您可能需要嘗試 pandas qcut function。 完整的文檔在這里

例如,要在您的代碼中使用它並獲得十分位數,您可以這樣做

n_buckets=10
df['quantile'] = pd.qcut(df['target_column'], q=n_buckets)

如果你想應用一個特定的 label 你可以做這樣的事情

n_buckets=10
df['quantile'] = pd.qcut(df['target_column'], q=n_buckets, labels=range(1,n_buckets+1))

PS:請注意,對於后一種情況,如果qcut無法生成所需數量的分位數(例如,因為沒有足夠的值來創建分位數),您將獲得一個異常,因為傳遞的標簽多於分位數。

暫無
暫無

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

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