我有以下数据框(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


我可以使用以下方式获取垃圾箱范围:

pandas.qcut(p1.ColA, 4)


有什么办法可以创建一个新列,其中每个值对应于bin的平均值?即对于每个垃圾箱,(a,b],我要(a + b)/ 2

最佳答案

关键是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

关于python - Pandas 为每一行分配其bin的平均值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23572620/

10-09 17:16