满足特定要求的行赋值:DataFrame赋值
YOPI.loc[YOPI['COPI']>95,'States']=4
YOPI.loc[(YOPI['COPI']>85)&(YOPI['COPI']<96),'States']=3
YOPI.loc[(YOPI['COPI']>75)&(YOPI['COPI']<86),'States']=2
YOPI.loc[YOPI['COPI']<76,'States']=1
loc[条件,‘列名’]=
这样就可以给满足不同条件的行,定义一个新的指标,并且赋值。比如这里的我让COPI大于95的,让它的States等于4。
于是我在做作业的过程之中有这样的想法:
for i in range(len(L_po1[0])):
L_po1[0].loc[i,'pro']=L_po1[0].loc[i,'Count']/L_po2[0].loc[L_po2[0]['States']==L_po1[0]['States'].loc[i],'sum']
等号后面,我是想写成一个除式,让每一行的pro等于每一行的count值除以满足条件的sum值,条件是L_po2[0][‘States’]==L_po1[0][‘States’].loc[i]。
因为分子是一个数字,而分母是一个series,所以会报错。
ValueError: Incompatible indexer with Series
我目前还没想到更好的办法,只有循环了。
for n in range(len(L_po1)):
L_po2[n]=L_po1[n].groupby(L_po1[n]['States'])['Count'].sum().reset_index().rename(columns={'Count':'sum'})
for i in range(len(L_po1[n])):
for j in range(len(L_po1[n])):
if L_po2[n]['States'].loc[j]==L_po1[n]['States'].loc[i]:
L_po1[n]['pro'].loc[i]=L_po1[n].loc[i]['Count']/L_po2[n]['sum'].loc[j] # 以后赋值统一按照此格式;赋值不能用iloc;loc必须重新设置索引
break
也就是每次遍历循环索引满足条件的行,一旦满足的话,就break出来。
因此要注意,按照最上面这样索引出来的依旧是Series,不是里面的一个元素。尽管你是让它等于一个数字(比如4),但是它还是默认给填充成了全是4。并不是说你让一个series等于一个数字的逻辑是成立的,因此特别要注意。