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