如何确保在python pandas pd.cut中获取零计数的标签

时间:2014-01-22 22:09:24

标签: pandas ipython

我正在分析一个DataFrame并获取我想要放入特定存储桶的时间计数(0-10秒,10-30秒等)。

这是一个简化的例子:

import pandas as pd

filter_values = [0, 10, 20, 30]  # Bucket Values for pd.cut

#Sample Times
df1 = pd.DataFrame([1, 3, 8, 20], columns  = ['filtercol'])

#Use cut to get counts for each bucket
out = pd.cut(df1.filtercol, bins = filter_values)
counts = pd.value_counts(out)
print counts

以上版画:

(0, 10]     3
(10, 20]    1
dtype: int64

您会注意到它没有显示(20,30)的任何值。这是一个问题,因为我想将它作为零输入到我的输出中。我可以使用以下代码处理它:

bucket1=bucket2=bucket3=0
if '(0, 10]' in counts: 
    bucket1=counts['(0, 10]']
if '(10, 20]' in counts: 
    bucket2=counts['(10, 30]']
if '(20, 30]' in counts: 
    bucket3=counts['(30, 60]']
print bucket1, bucket2, bucket3

但我想要一个更简洁的方法,我可以使用:

print counts['(0, 10]'], counts['(10, 30]'], counts['(30, 60]']

理想情况下,打印基于filter_values中的值,因此它们只位于代码中的一个位置。是的我知道我可以更改打印以使用filter_values [0] ...

最后使用cut时有一种指定无穷大的方法,所以最后一个桶的值都大于60?

干杯, 斯蒂芬

1 个答案:

答案 0 :(得分:1)

您可以reindex按分类级别

In [11]: pd.value_counts(out).reindex(out.levels, fill_value=0)
Out[11]: 
(0, 10]     3
(10, 20]    1
(20, 30]    0
dtype: int64