给出如下所示的数据框:
Desired DataFrame values for Quantile and Value columns
我有两个目标。
为每个类别(a,b,c等)创建一个分位数,并将其分配给“分位数”列中的值。
将“得分”列中的每一行与该组的相应“分位数”值进行比较。如果它在第90个百分点以上,则将值3分配给“值3”列,在60之上将其分配给2,依此类推。
到目前为止,我已经能够(以一种低效的方式)创建以下内容,但是我确信必须有一种方法可以使这种方式更有效:
df = pd.read_excel("file.xlsx")
conditions2 = (df['scaled_score']>=df['quantiles2']) & (df['scaled_score']<df['quantiles1'])
conditions3 = (df['scaled_score']>=df['quantiles3']) & (df['scaled_score']<df['quantiles2'])
conditions4 = (df['scaled_score']>=df['quantiles3'])
df['quantiles1'] = df.groupby([‘Group']).scaled_score.quantile(0.9)
dfr1 = np.where(df['scaled_score']>=df['quantiles1'] ,0.5,0)
df['quantiles2'] = df.groupby([‘Group']).scaled_score.quantile(0.7)
dfr2 = np.where(conditions2 ,0.35,0)
df['quantiles3'] = df.groupby([‘Group']).scaled_score.quantile(0.5)
dfr3 = np.where(conditions3,0.25,0)
df['quantiles4'] = df.groupby([‘Group']).scaled_score.quantile(0.4)
dfr4 = np.where(conditions4,0.15,0)
dtest1=pd.DataFrame(dfr1)
dtest2=pd.DataFrame(dfr2)
dtest3=pd.DataFrame(dfr3)
dtest4=pd.DataFrame(dfr4)
dftest = pd.concat([dtest1,dtest2]).groupby(level=0).max()
dftest = pd.concat([dftest,dtest3]).groupby(level=0).max()
dftest = pd.concat([dftest,dtest4]).groupby(level=0).max()
df.drop(['quantile'],axis=1)
del df[‘quantile’, axis=1]
dftest.index=df.index
Panel2 = df.join(dftest, on=df.index)
df[‘Value'] = dftest
答案 0 :(得分:0)
我会做qcut
s=df.groupby('Value').apply(lambda x : pd.qcut(x['scaled_score'],[0,0.5,0.7,0.9,1],labels=[0.15,0.25,0.35,0.5])).reset_index(level=0,drop=True)
df['New']=s