Pandas为每一行分配其bin的平均值

时间:2014-05-09 19:37:01

标签: python pandas

我有以下数据框(p1.head(7)):

     ColA
0    6.286333
1    3.317000
2    13.24889
3    26.20667
4    26.25556
5    60.59000
6    79.59000
7    1.361111

我可以使用以下方式获取bin范围:

pandas.qcut(p1.ColA, 4)

有没有办法可以创建一个新列,其中每个值对应bin的平均值?即每个箱子,(a,b),我想要(a + b)/ 2

2 个答案:

答案 0 :(得分:1)

此处的关键是retbins上的qcut选项。

import pandas
df = pandas.DataFrame(np.random.random(100)*100, columns=['val1'])

pctiles = pandas.qcut(df['val1'],4,retbins=True)
pctile_object = pctiles[0]
pctile_boundaries = pctiles[1]

如果你没有通过pctile_object,那么retbins=True就是qcut会返回的内容,pctile_boundaries是区间边界的numpy数组。

import numpy
bin_halfway = pctile_boundaries[:-1] + (numpy.diff(pctile_boundaries)/2)

这给了我们垃圾箱的中间点。

现在我们只使用区间名称(作为字符串)和中间点来创建数据帧。

df2 = pandas.DataFrame({'quartile boundaries': pctile_object.levels, 
                        'midway point': bin_halfway})

最后,将bin中间点合并回原始数据帧。

df['quartile boundaries'] = pctile_object
pandas.merge(df,df2,on='quartile boundaries')

然后,如果需要,可以删除quartile boundaries

答案 1 :(得分:1)

我编写了一个利用@ exp1orer逻辑的函数:

def midway_quantiles(feature_series,q=4):
    import pandas as pd
    pctiles = pd.qcut(feature_series,q,retbins=True)
    pctile_object = pctiles[0]
    df1= pd.DataFrame({"feature":feature_series,"q_bound": pctile_object})
    pctile_boundaries = pctiles[1]
    import numpy as np
    bin_halfway = pctile_boundaries[:-1] + (np.diff(pctile_boundaries)/2)
    df2 = pd.DataFrame({"q_bound": pctile_object.cat.categories, 
                            "midpoint": bin_halfway})
    df3=pd.merge(df1,df2,on="q_bound",how="left")
    return df3["midpoint"]