Python Binning代码并取平均值

时间:2018-04-11 13:17:58

标签: python dataframe binning

我是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并获取每个分档中项目数的平均值,如这些电子表格所示:

enter image description here

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

enter image description here

非常感谢提前。

2 个答案:

答案 0 :(得分:2)

使用cutcrosstab

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

答案 1 :(得分:0)

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

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