计算范围内的出现次数

时间:2021-07-19 06:55:43

标签: python pandas numpy matplotlib

我有一个像这样的数据集:

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 轴。我如何实现这一目标?

2 个答案:

答案 0 :(得分:4)

制表

首先 enter image description here 将金额放入范围,然后 cut() 与类型:

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,则在制表时将它们 crosstab() 作为字符串:

    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')
    

绘图

使用 replace() 绘制交叉表:

tab.plot.bar()

DataFrame.plot.bar()

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

seaborn.barplot()

答案 1 :(得分:1)

您可以使用 crosstab figurepandas.cut

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
相关问题