我有一个像这样的数据集:
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 轴。我如何实现这一目标?
答案 0 :(得分:4)
首先 将金额放入范围,然后 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()
sns.barplot(
data=tab.reset_index().melt('Range', value_name='Count'),
x='Range',
y='Count',
hue='TYPE',
)
答案 1 :(得分:1)
您可以使用 和 pandas.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