【问题标题】:Python Binning code and taking averagePython Binning 代码并取平均值
【发布时间】:2018-04-11 13:17:58
【问题描述】:

我是 Python 新手,正在努力解决以下问题。 我有以下数据框:

cat data
1   122.8099975
2   131.02
1   49.123999
2   122.5250015
3   40.86333217
2   61.40250025
2   122.5999985
3   35.02142771
3   246.320007
3   123.885002
3   61.942501
1   247.770004
1   123.885002

bins=array([  0,  20,  40,  60,  80, 100, 120, 140, 160, 180, 200, 220, 240, 260])

我想通过执行以下操作来创建一个新列:

对于每个类别("cat"),将数据分箱到bins 中,并取每个分箱中项目数的平均值,如这些电子表格所示:

然后将平均值分配给新列中的相关类别:

非常感谢。

【问题讨论】:

    标签: python dataframe binning


    【解决方案1】:

    使用cut 和crosstab:

    i = pd.cut(df.set_index('cat').data, bins=bins).reset_index()
    j = pd.crosstab(i.data, i.cat)
    
    cat         1  2  3
    data               
    (0, 20]     0  0  0
    (20, 40]    0  0  1
    (40, 60]    1  0  1
    (60, 80]    0  1  1
    (80, 100]   0  0  0
    (100, 120]  0  0  0
    (120, 140]  2  3  1
    (140, 160]  0  0  0
    (160, 180]  0  0  0
    (180, 200]  0  0  0
    (200, 220]  0  0  0
    (220, 240]  0  0  0
    (240, 260]  1  0  1
    

    对于第二部分,使用mean,计算均值,然后使用map 分配回df -

    df['average'] = df['cat'].map(j.mean())
    df
    
        cat        data   average
    0     1  122.809998  0.307692
    1     2  131.020000  0.307692
    2     1   49.123999  0.307692
    3     2  122.525001  0.307692
    4     3   40.863332  0.384615
    5     2   61.402500  0.307692
    6     2  122.599999  0.307692
    7     3   35.021428  0.384615
    8     3  246.320007  0.384615
    9     3  123.885002  0.384615
    10    3   61.942501  0.384615
    11    1  247.770004  0.307692
    12    1  123.885002  0.307692
    

    【讨论】:

    • 这个很有用,怎么去绿色的“平均”列的最后阶段?
    • @ladidalimey 欢迎您,您可以通过单击我答案左侧的灰色对勾来接受答案,谢谢。
    • 此代码 100% 有效。但是,当“猫”的数量增加时,我发现“交叉表”部分正在耗尽我的 PC 内存。有没有办法从“i”到使用更少内存的最终“平均”列?
    【解决方案2】:

    我强烈建议您使用 numpy 包进行此类统计分析。

    然后,您只需使用numpy.histogram 开始对您的数据进行分类,然后从那里继续提取其他统计信息。当然,对于更高级的用例,可能需要使用 scipy 或 pandas 之类的东西,但 numpy 很可能满足您对大多数事情的需求,并且现在是一个相当标准的模块。

    【讨论】:

      猜你喜欢
      • 2019-08-08
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      • 2020-10-01
      • 2016-06-10
      相关资源
      最近更新 更多