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