假设我有一个0到100之间的巨大数字列表。 我计算范围,取决于最大数量,然后说有10个箱子。 所以我的范围是例如
ranges = [0,10,20,30,40,50,60,70,80,90,100]
现在我计算0-10,10-20等每个范围内的出现次数。 我遍历列表中的每个数字并检查范围。 我认为这不是运行速度方面的最佳方式。
我可以通过使用熊猫来加固它,例如pandas.groupby,怎么样?
答案 0 :(得分:9)
我们可以使用pd.cut
将值分组到范围中,然后我们可以groupby
这些范围,最后调用count
来计算现在分箱到这些范围内的值:
In [82]:
df = pd.DataFrame({"a": np.random.random_integers(0, high=100, size=100)})
ranges = [0,10,20,30,40,50,60,70,80,90,100]
df.groupby(pd.cut(df.a, ranges)).count()
Out[82]:
a
a
(0, 10] 10
(10, 20] 6
(20, 30] 12
(30, 40] 9
(40, 50] 11
(50, 60] 12
(60, 70] 9
(70, 80] 13
(80, 90] 9
(90, 100] 9
答案 1 :(得分:5)
惊讶的是我还没有看到这个,所以事不宜迟,这里是
.value_counts(bins=N)
使用pd.cut
和binBy来计算bin是一个两步过程。 value_counts
允许您使用bins
参数作为快捷方式:
# Uses Ed Chum's setup. Cross check our answers match!
np.random.seed(0)
df = pd.DataFrame({"a": np.random.random_integers(1, high=100, size=100)})
df['a'].value_counts(bins=10, sort=False)
(0.9, 10.9] 11
(10.9, 20.8] 10
(20.8, 30.7] 8
(30.7, 40.6] 13
(40.6, 50.5] 11
(50.5, 60.4] 9
(60.4, 70.3] 10
(70.3, 80.2] 11
(80.2, 90.1] 13
(90.1, 100.0] 4
Name: a, dtype: int64
这将创建10个均匀间隔的右闭合间隔,并对您的数据进行二进制计数。将需要sort=False
来避免value_counts
以减少的计数顺序对结果进行排序。
为此,您可以将列表传递给bins
参数:
bins = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
df['a'].value_counts(bins=bins, sort=False)
(-0.001, 10.0] 11
(10.0, 20.0] 10
(20.0, 30.0] 8
(30.0, 40.0] 13
(40.0, 50.0] 11
(50.0, 60.0] 9
(60.0, 70.0] 10
(70.0, 80.0] 11
(80.0, 90.0] 13
(90.0, 100.0] 4
Name: a, dtype: int64