簡體   English   中英

計算范圍內的出現次數

[英]Count occurrences within range

我有一個像這樣的數據集:

ID Amt   TYPE
1  1000  A
2  200   NA
3  1100  S

我需要計算每種類型在特定范圍內的出現次數:

Range     A_Count NA_Count S_Count
0-1000    1       1        0
1001-2000 0       0        1

我很想得到這個,以便我可以使用這個數據框繪制一個圖,以范圍為 x 軸,計數為 y 軸。 我如何實現這一目標?

制表

首先cut()將金額划分為范圍,然后crosstab()與類型:

df['Range'] = pd.cut(df.Amt, bins=[0, 1000, 2000])
tab = pd.crosstab(df.Range, df.TYPE).add_suffix('_Count')

# TYPE          A_Count  NA_Count  S_Count
# Range                                   
# (0, 1000]           1         1        0
# (1000, 2000]        0         0        1
  • 請注意,如果NA此處表示NaN ,則在制表時將它們replace()為字符串:

     tab = pd.crosstab(df.Range, df.TYPE.replace(np.nan, 'NA')).add_suffix('_Count')
  • 默認情況下,制表將丟棄空箱。 如果要保留所有垃圾箱,請使用dropna=False

     tab = pd.crosstab(df.Range, df.TYPE, dropna=False).add_suffix('_Count')

繪圖

使用DataFrame.plot.bar()繪制交叉表:

tab.plot.bar()

seaborn.barplot()

sns.barplot(
    data=tab.reset_index().melt('Range', value_name='Count'),
    x='Range',
    y='Count',
    hue='TYPE',
)

交叉表圖

您可以使用pandas.cutpandas.DataFrame.unstack

df['group'] =  pd.cut(df.Amt, [0,1000,1100])
(df.groupby('group')
   ['TYPE'].value_counts(dropna=False)
   .unstack(-1)
   .fillna(0)
   .add_suffix('_count')
)

輸出:

TYPE          nan_count  A_count  S_count
group                                    
(0, 1000]           1.0      1.0      0.0
(1000, 1100]        0.0      0.0      1.0

暫無
暫無

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

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