繁体   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