Python:根据其他两个列的比较为DataFrame列元素分配值

时间:2019-10-27 23:41:24

标签: python pandas dataframe

给出如下所示的数据框:

Desired DataFrame values for Quantile and Value columns

我有两个目标。

  1. 为每个类别(a,b,c等)创建一个分位数,并将其分配给“分位数”列中的值。

  2. 将“得分”列中的每一行与该组的相应“分位数”值进行比较。如果它在第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

1 个答案:

答案 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