Pandas分组按值范围

138

在pandas中,是否有一种简单的方法可以对一系列数值增量调用groupby?例如,给定下面的示例,我是否可以使用0.155的增量对列B进行分组,以便例如,列B中的前几组被划分为'0-0.155,0.155-0.31 ...`

import numpy as np
import pandas as pd
df=pd.DataFrame({'A':np.random.random(20),'B':np.random.random(20)})

     A         B
0  0.383493  0.250785
1  0.572949  0.139555
2  0.652391  0.401983
3  0.214145  0.696935
4  0.848551  0.516692

或者,我可以先将数据按照这些增量分类到一个新的列中,然后使用 groupby 来确定在列 A 中可能适用的任何相关统计信息?

3个回答

186

你可能会对pd.cut感兴趣:

>>> df.groupby(pd.cut(df["B"], np.arange(0, 1.0+0.155, 0.155))).sum()
                      A         B
B                                
(0, 0.155]     2.775458  0.246394
(0.155, 0.31]  1.123989  0.471618
(0.31, 0.465]  2.051814  1.882763
(0.465, 0.62]  2.277960  1.528492
(0.62, 0.775]  1.577419  2.810723
(0.775, 0.93]  0.535100  1.694955
(0.93, 1.085]       NaN       NaN

[7 rows x 2 columns]

15
我可以为多个维度进行这个操作吗?也就是同时按两个值分组? - madsthaks
3
我需要使用两列进行分组。第一列是字符串,我需要将具有相同名称的行进行分组。在这些分组中,我需要根据第二列的值范围对它们进一步分组。我按以下方式完成:(qa_scores_data.groupby(['Video Name', pandas.cut(qa_scores_data['Frame Name'].astype('float'), [0.5, 12.5, 24.5, 36.5, 48.5])])).mean() - Nagabhushan S N
2
我会得到这个错误:ValueError: Length of grouper (9235) and axis (8769) must be same length - Peyman
B的第一个区间是(0, 0.155),而B的第一行是0.246394 > 0.155,我认为0.246394应该落入第二个区间(0.155, 0.31]。对吗? - Jacqueline P.
@JacquelineP,末尾的.sum()函数是将(0,0.155]之间的所有数字相加,以得到您所看到的数字。 - elPastor
我还想指出,np.arrange()虽然完全可用,但一个简单的列表同样有效(尚未测试大数据集的性能)。 - elPastor

19

试试这个:

df = df.sort_values('B')
bins =  np.arange(0, 1.0, 0.155)
ind = np.digitize(df['B'], bins)
    
print df.groupby(ind).head() 

当然,您可以在这些组上使用任何函数,而不仅仅是head


如果需要使用B组中的第一个值,并且该值的平均值与其他相应列的平均值一起计算,该怎么办? - Alex

2

这是我如何使用groupby函数的方式

df1=data
bins = [0,40,50,60,70,100]
group_names=['F','S','C','B','A']
df1['grade']=pd.cut(data['student_mark'],bins,labels=group_names)
df1

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