2021-10-09

满足特定要求的行赋值: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等于一个数字的逻辑是成立的,因此特别要注意。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值