【问题标题】:Pandas Groupby Range of ValuesPandas Groupby 值范围
【发布时间】:2014-02-21 20:33:49
【问题描述】:

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 的任何相关统计信息?

【问题讨论】:

    标签: python group-by pandas


    【解决方案1】:

    试试这个:

    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

    【讨论】:

      【解决方案2】:

      你可能对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]
      

      【讨论】:

      • 我可以为多个维度执行此操作吗?基本上同时按两个值分组?
      • 我必须使用 2 列进行分组。第一列是一个字符串,我必须对具有相同名称的行进行分组。在这些组中,我不得不根据第二列中的值范围对它们进行进一步分组。我是这样做的:(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()
      • 我会收到这个错误:ValueError: Length of grouper (9235) and axis (8769) must be same length
      • B的第一个范围是(0, 0.155),而B的第一行是0.246394 > 0.155,我想0.246394应该落入第二个范围(0.155, 0.31]。不是吗?
      猜你喜欢
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 2019-03-31
      • 2014-09-20
      • 2016-11-04
      相关资源
      最近更新 更多