python按某一列或多列的值进行条件判断并形成新列

需求

从excel读取数据用DataFrame存储,

1. 逐行处理,当指定多列的值满足一定条件时,取这几列的某个值作为该行的新列值.

2. 将日期划分为上、中、下旬并作为新列

知识点

1. np.where是好理解好用的函数,可以当if else的用,当某列满足一个条件时取某列的值,否则取其他列的值。像excel里的if函数,可以嵌套使用。参考python条件赋值numpy.where() 用法详解

2.直接用df[条件语句][列名]也可以选出符合条件的列值,如:

df['新列名']=df[(df['列A']<=3)|(df['列B'].isin(['Chicago','Boston']))]['列C']

将符合(df['列A']<=3)|(df['列B']=='Chicago')的列C值赋给新列。

也可以直接用几个条件语句的真假结果赋值给一个新列,如:

df['新列名']=(df['列A']<=3)|(df['列B'].isin(['Chicago','Boston']))

也可以用loc函数。

3.df.max也是个好用的函数,可以取同一行几列值中最大的,也可以取同一列中最大的。

代码

1.按col_night,col_day,col_whole三列的值生成标志字段rs_flag;当col_whole>=50时取它自己,否则取其他两个的最大值为新值字段rs_value

用loc函数;每个条件语句要用();用df.max函数;对于赋值不来自原有字段的,先赋值为数字,便于后续计算,再按条件修改

#增加字段rs_flag, rs_value

#只要col_night,col_day,col_whole有一个达到条件就记为1,下面的条件语句必须加()

data['rs_flag' ] = 0

data.loc[ (data[col_night]>=30) | (data[col_day]>=30) | (data[col_whole]>=50) , 'rs_flag' ] = 1

#rs_value取同一行这几列的最大值

#这个又犯了将不同条件放在一起比较的错误,大于30的和大于50的条件不同,可能取出的最大值并不一定大于50  data.loc[ (data[col_night]>=30) | (data[col_day]>=30) | (data[col_whole]>=50) , 'rs_value']=data[[col_night,col_day,col_whole]].max(axis=1)
            data['rs_value']=np.where(data[col_whole]>=50, data[col_whole], np.where((data[col_night]>=30) | (data[col_day]>=30),data[[col_night,col_day]].max(axis=1),0))

2.根据日dd字段生成旬字段dd_xun,类似于SQL的case when;if else嵌套使用; 用df.apply函数,用lambda函数,注意语法

#增加dd_xun字段

data['dd_xun'] = data['dd'].apply(lambda x: '上旬' if x<=10 else '中旬' if x<=20 else '下旬')

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值