Pandas如何对分组数据进行区间计数

24

假设我有一个巨大的数字列表,其中的数字在0到100之间。我会根据最大数字计算范围,然后将其分成10个箱子。因此,我的范围例如为

ranges = [0,10,20,30,40,50,60,70,80,90,100]

现在我正在计算每个范围内的出现次数,如0-10、10-20等。 我遍历列表中的每个数字并检查其所在的范围。 我认为这不是最优的运行速度方式。

我可以使用 pandas 来加快速度吗,例如使用 pandas.groupby,具体如何实现?

2个回答

40

我们可以使用 pd.cut 将值分成区间,然后我们可以groupby这些区间,最后调用count来统计现在被分到这些区间内的值:

np.random.seed(0)
df = pd.DataFrame({"a": np.random.random_integers(1, high=100, size=100)})
ranges = [0,10,20,30,40,50,60,70,80,90,100]
df.groupby(pd.cut(df.a, ranges)).count()

            a
a            
(0, 10]    11
(10, 20]   10
(20, 30]    8
(30, 40]   13
(40, 50]   11
(50, 60]    9
(60, 70]   10
(70, 80]   11
(80, 90]   13
(90, 100]   4

35

令人惊讶的是我还没有看到这个,所以在没有更多的话要说之前,这里是:

.value_counts(bins=N)

通过使用pd.cut计算区间然后进行分组是一个两步过程。而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

1
对于numpy数组x,使用pd.value_counts(x, bins=10) - Eli Simhayev
有没有一种方法可以使用右开和左闭的箱子来实现这个,或者任何变体? - Prithvi Thakur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接